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


255

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();

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


1
복잡한 쿼리의 경우 람다 구문이 더 이해하기 쉽고 읽을 수 있지만 쿼리 구문은 단순히 더 예쁘습니다.
nawfal

답변:


255

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

  • 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 };

2
좋은 대답입니다. ".Select (name => new {name, fName})"이하는 일에 대해 좀 더 말씀해 주시겠습니까?
quillbreaker

12
익명 형식의 개별 이름 (anne, williams, john 등)과 전체 이름을 선택합니다. 이렇게하면 원래 전체 이름을 "운반"하여 나머지 쿼리에서 전체 이름과 개별 단어에 모두 액세스 할 수 있습니다.
Joe Albahari

58

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

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();

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


29

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

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

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


"그들은 당신이 직접 작성할 수있는 확장 방법이기 때문에." -이 문제에 부딪 치겠습니까? stackoverflow.com/a/3850254/1175496
The Red Pea

20

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);

9
쿼리 스타일을 사용할 수없는 VB 개발자에게 동정심을 나타냅니다.
nawfal

1
마지막 C # 예제는 너무 단순해서 가치가 없습니다 :`dataTable1.AsEnumerable (). Take (10);
Emyr

@Emyr : "VB.NET의 쿼리 구문이 C #보다 강력하고 덜 장황하다"로 시작하는 마지막 단락은 VB.NET의 쿼리 구문을 C #과 비교하는 것입니다. 메서드 구문을 사용하고 있습니다.
Tim Schmelter

15

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


9
유창한 구문을 사용하면 여러 조인이 상당히 빨리 힘들 수 있습니다. 비록 일반적으로 조인이 관여되지 않는 한 나는 유창하게 사용합니다.
로마 Starkov

1
@Instance Hunter : 동일합니다. 유창한 구문이라는 개념을 이해하기 시작하는 데 꽤 오랜 시간이 걸렸습니다. 강력한 열거 형 및 "순수한"기능이라는 아이디어와 함께 이제는 코드 표현이 좋지 않은 이전의 까다로운 상황을 실제로 즐깁니다. 두뇌의 ye-ole-SQL-part에게는 쿼리 구문을 사용하는 것이 여전히 축복입니다.
Xan-Kun Clark-Davis

13

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


8

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


5

이 질문에 C # 태그가 지정되어 있음을 알고 있지만 Fluent 구문은 VB.NET에서 매우 장황합니다.


4

나는 Fluent 구문을 정말 좋아하고 가능한 경우 사용하려고 시도하지만 특정 경우, 예를 들어 조인을 사용하는 경우 일반적으로 쿼리 구문을 선호합니다.이 경우 읽기가 더 쉽다고 생각합니다. 람다보다 Query (SQL과 유사한) 구문에 더 익숙합니다.


4

유창한 형식을 이해하고 좋아하지만 가독성을 위해 당분간 쿼리를 고수했습니다. LINQ를 처음 접하는 사람들은 Query를 훨씬 더 편하게 읽을 수 있습니다.


4

SQL을 사용하는 전통적인 웹 프로그래밍에서 나온 쿼리 구문을 선호합니다. 머리를 감싸는 것이 훨씬 쉽습니다. 그러나 .Where (lambda)는 훨씬 짧아서 활용하기 시작할 것입니다.


4

나는 약 6 개월 동안 Linq를 사용하고 있습니다. 처음 사용하기 시작했을 때 T-SQL과 매우 유사하므로 쿼리 구문을 선호했습니다.

그러나 재사용 가능한 코드 덩어리를 확장 방법으로 작성하고 함께 묶기 쉽기 때문에 점차 전자에 접근하고 있습니다. 각 절을 자체 줄에 넣으면 가독성이 많이 도움이됩니다.


3

방금 회사 표준을 설정했으며 Extension 메서드 사용을 시행합니다. 하나를 선택하고 코드에서 섞지 않는 것이 좋습니다. 확장 메소드는 다른 코드와 비슷하게 읽습니다.

이해 구문에는 쿼리 주위에 모든 연산자와 괄호를 사용하지 않으며 확장 메소드를 추가하면 결국 확장 메소드 사용을 처음부터 요구합니다.

그러나 대부분 예외는 있지만 개인 취향입니다.


3
나는 개인적 취향을 강요하지 않을 것입니다. 그러나 그것은 저입니다.
Memet Olsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.