문제

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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top