[C#] 유창하고 쿼리 표현-서로에 대한 이점이 있습니까?

LINQ는 제네릭 이후 .NET에서 가장 크게 개선 된 기능 중 하나이며 시간과 코드를 절약합니다. 그러나 유창한 구문은 쿼리 표현식 구문보다 훨씬 자연스럽게 보입니다.

var title = entries.Where(e => e.Approved)
    .OrderBy(e => e.Rating).Select(e => e.Title)
    .FirstOrDefault();

var query = (from e in entries
             where e.Approved
             orderby e.Rating
             select e.Title).FirstOrDefault();

둘 사이에 차이점이 있습니까? 아니면 다른 것보다 특별한 이점이 있습니까?



답변

둘 다 더 낫지는 않습니다. 그들은 서로 다른 요구에 부응합니다. 여러 범위 변수 를 활용하려는 경우 쿼리 구문이 자동으로 나타납니다 . 이것은 세 가지 상황에서 발생합니다.

  • let 키워드를 사용하는 경우
  • 여러 생성기가있는 경우 ( from 절)
  • 조인 할 때

다음은 LINQPad 샘플의 예입니다.

string[] fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };

var query =
  from fullName in fullNames
  from name in fullName.Split()
  orderby fullName, name
  select name + " came from " + fullName;

이제 이것을 메소드 구문에서 동일한 것과 비교하십시오.

var query = fullNames
  .SelectMany (fName => fName.Split().Select (name => new { name, fName } ))
  .OrderBy (x => x.fName)
  .ThenBy  (x => x.name)
  .Select  (x => x.name + " came from " + x.fName);

반면에 메서드 구문은 전체 쿼리 범위의 쿼리 연산자를 표시하며 간단한 쿼리로 더 간결합니다. 쿼리와 메서드 구문을 혼합하여 두 가지 이점을 모두 누릴 수 있습니다. 이것은 종종 LINQ to SQL 쿼리에서 수행됩니다.

var query =
  from c in db.Customers
  let totalSpend = c.Purchases.Sum (p => p.Price)    // Method syntax here
  where totalSpend > 1000
  from p in c.Purchases
  select new { p.Description, totalSpend, c.Address.State };


답변

전체 식을 그런 식으로 작성할 수있을 때 후자를 사용하는 것을 선호합니다 (때로는 “쿼리 이해 구문”이라고 함).

var titlesQuery = from e in entries
                  where e.Approved
                  orderby e.Rating
                  select e.Titles;

var title = titlesQuery.FirstOrDefault();

(괄호)와을 추가하자마자 .MethodCalls()변경합니다.

전자를 사용할 때 일반적으로 다음과 같이 한 줄에 하나의 절을 넣습니다.

var title = entries
    .Where (e => e.Approved)
    .OrderBy (e => e.Rating)
    .Select (e => e.Title)
    .FirstOrDefault();

나는 그것을 조금 더 읽기 쉽다는 것을 안다.


답변

각 스타일에는 장단점이 있습니다. 조인에있어 쿼리 구문이 더 좋고 쿼리 내에 임시 변수를 쉽게 만들 있는 유용한 let 키워드가 있습니다.

반면 유창한 구문에는 쿼리 구문을 통해 노출되지 않는 훨씬 더 많은 메서드와 작업이 있습니다. 또한 그것들은 확장 방법이기 때문에 직접 작성할 수 있습니다.

쿼리 구문을 사용하여 LINQ 문을 작성할 때마다 괄호로 묶고 유창한 LINQ 확장 방법을 사용하는 것으로 나타났습니다. 쿼리 구문에는 그 자체로 사용할 기능이 충분하지 않습니다.


답변

VB.NET 에서는 쿼리 구문을 매우 선호합니다.

나는 추악한 Function키워드 를 반복하는 것을 싫어합니다 .

Dim fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };
Dim query =
     fullNames.SelectMany(Function(fName) fName.Split().
     Select(Function(Name) New With {Name, fName})).
     OrderBy(Function(x) x.fName).
     ThenBy(Function(x) x.Name).
     Select(Function(x) x.Name & " came from " & x.fName)

이 깔끔한 쿼리는 내 의견으로는 훨씬 더 읽기 쉽고 유지 관리가 가능합니다.

query = From fullName In fullNames
        From name In fullName.Split()
        Order By fullName, name
        Select name & " came from " & fullName

VB.NET의 쿼리 구문은 C #보다 더 강력하고 덜 장황합니다. https://stackoverflow.com/a/6515130/284240

예를 들어이 LINQ to DataSet (Objects) 쿼리

VB.NET :

Dim first10Rows = From r In dataTable1 Take 10

씨#:

var first10Rows = (from r in dataTable1.AsEnumerable()
                   select r)
                   .Take(10);


답변

쿼리 구문이 전혀 없습니다. 내 마음 속에 그럴 이유가 없습니다. .Select 및 anonymous 유형으로 달성 할 수 있습니다. 나는 거기에 “구두”로 훨씬 더 조직적으로 보인다고 생각합니다.


답변

어디서나 유창한 인터페이스를 제공합니다. select 또는 orderby가 필요한 경우 일반적으로 Query 구문을 사용합니다.


답변

유창한 구문은 실제로 더 강력 해 보이며 코드를 재사용 가능한 작은 메서드로 구성하는 데 더 효과적입니다.