LINQ에서 그룹 별 최대를 어떻게 찾습니까?
문제
LINQ에서 "그룹 별 최대"문제를 해결하려고합니다. 시작하려면 다음 구조의 엔티티 프레임 워크를 사용하여 모델링 된 데이터베이스가 있습니다.
Customer:
---------
CustomerID : Int32
Name : String
Order:
-------
OrderID : Int32
CustomerID : Int32
Total : Decimal
이를 통해 고객에서 주문으로 내비게이션을 제공하고 소유자에게 주문할 수 있습니다.
데이터베이스에서 상위 10 개 고객 주문을 찾을 수있는 LINQ 쿼리를 만들려고합니다. 간단한 사례는 다음과 같이 생각하기가 매우 쉬웠습니다.
var q = (
from order in _data.Orders // ObjectQuery<Order>
orderby order.Amount descending select order
).Take(10);
그러나이 목록에서 고유 한 고객 만 보여주고 싶습니다. 나는 여전히 LINQ에 조금 새로운 것이지만 이것이 내가 생각해 낸 것입니다.
var q = (
from order in _data.Orders // ObjectQuery<Order>
group order by order.Customer into o
select new {
Name = o.Key.Name,
Amount = o.FirstOrDefault().Amount
}
).OrderByDescending(o => o.Amount).Take(10);
이것은 작동하는 것 같지만 이것이 최선의 접근법인지 확실하지 않습니다. 구체적으로, 나는 매우 큰 데이터베이스에 대한 쿼리의 성능에 대해 궁금합니다. 또한, 사용 FirstOrDefault
그룹 쿼리의 메소드는 조금 이상하게 보입니다 ...
누구든지 더 나은 접근 방식이나 이것이 올바른 접근 방식이라는 확신을 줄 수 있습니까?
해결책
당신은 할 수 있습니다 :
var q = (
from order in _data.Orders // ObjectQuery<Order>
orderby order.Amount descending select order
).Distinct().Take(10);
나는 일반적으로 생성 된 SQL을보고 가장 좋은 것이 무엇인지 볼 것입니다.
다른 팁
Customer
.Select(c=>new {Order= c.Orders.OrderByDescending(o=>o.Total).First()})
.OrderByDescending(o=>o.Total)
.Take(10);
제휴하지 않습니다 StackOverflow