유창하고 쿼리 표현-서로에 대한 이점이 있습니까?
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 구문을 사용합니다.
유창한 구문은 실제로 더 강력 해 보이며 코드를 재사용 가능한 작은 메소드로 구성하는 데 더 효과적입니다.
이 질문에 C # 태그가 지정되어 있음을 알고 있지만 Fluent 구문은 VB.NET에서 매우 장황합니다.
나는 Fluent 구문을 정말 좋아하고 가능한 경우 사용하려고 시도하지만, 예를 들어 조인을 사용하는 경우와 같이 특정 경우에는 쿼리 구문을 선호합니다.이 경우 읽기가 더 쉽다고 생각합니다. 람다보다 Query (SQL과 유사한) 구문에 더 익숙합니다.
유창한 형식을 이해하고 좋아하지만 가독성을 위해 당분간 쿼리를 고수했습니다. LINQ를 처음 접하는 사람들은 Query를 훨씬 더 편하게 읽을 수 있습니다.
SQL을 사용하는 전통적인 웹 프로그래밍에서 나온 쿼리 구문을 선호합니다. 머리를 감싸는 것이 훨씬 쉽습니다. 그러나 .Where (lambda)는 훨씬 짧아서 활용하기 시작할 것입니다.
나는 약 6 개월 동안 Linq를 사용하고 있습니다. 처음 사용하기 시작했을 때 T-SQL과 매우 유사하므로 쿼리 구문을 선호했습니다.
그러나 재사용 가능한 코드 덩어리를 확장 방법으로 작성하고 함께 연결하기 쉽기 때문에 점차 전자에 접근하고 있습니다. 각 절을 고유 한 줄에 배치하면 가독성이 향상됩니다.
방금 회사 표준을 설정했으며 Extension 메서드 사용을 시행합니다. 하나를 선택하고 코드에서 섞지 않는 것이 좋습니다. 확장 메소드는 다른 코드와 비슷하게 읽습니다.
이해 구문에는 쿼리 주위에 모든 연산자와 괄호를 사용하지 않으며 확장 메소드를 추가하면 결국 확장 메소드 사용을 처음부터 요구합니다.
그러나 대부분 예외는 있지만 개인 취향입니다.
'IT story' 카테고리의 다른 글
포인터 대 참조 (0) | 2020.04.06 |
---|---|
ReactiveCocoa vs RxSwift-장단점? (0) | 2020.04.06 |
Xcode 6 스토리 보드의 "여백에 구속"이란 무엇입니까 (0) | 2020.04.06 |
JSON 데이터를 Java 객체로 변환 (0) | 2020.04.06 |
GNU Make와 함께 CMake 사용 : 정확한 명령을 어떻게 볼 수 있습니까? (0) | 2020.04.06 |