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 구문을 사용합니다.
답변
유창한 구문은 실제로 더 강력 해 보이며 코드를 재사용 가능한 작은 메서드로 구성하는 데 더 효과적입니다.