2016-06-20 4 views
2

나는 기본적으로Linq에 최대 날짜 별 엔티티 그룹

나는 지난 5 개 주문 목록을 얻기 위해 찾고 아래 SQL을 기반으로 Linq에 엔티티에 대한 쿼리를 작성하는 것을 시도하고있다가, 주문 날짜가에있는에 가입하세요 뷰에 열거되고

var query = Context.Titles 
      .Include(x => x.MisAccount) 
      .Include(x => x.TitleDetails) 
      .Where(x => x.TitleDetails.Any()); 

if (!string.IsNullOrEmpty(model.MisCustomer)) 
{ 
    query = query.Where(x => x.MisAccount.Code == model.MisCustomer); 
} 

if (!User.IsInRole(Permission.CanAccessAllCustomers.ToString())) 
{ 
    var predicate = PredicateBuilder.False<Title>(); 

    foreach (var customer in validCustomers) 
    { 
     var cust = customer.Code; 
     predicate = predicate.Or(x => x.MisAccount.Code == cust); 
    } 

    query = query.AsExpandable().Where(predicate); 
} 

model.LatestOrders = query.Take(5) 

LatestOrders을 다음과 같이 (TitleDetails)의 자식 세부 테이블

SELECT t.Name, t.LimpIsbn, t.CasedIsbn, max(td.OrderDate) LastOrder 
FROM [inform].[dbo].[Titles] t 
left join [inform].[dbo].[TitleDetails] td on t.id = td.TitleId 
where td.OrderDate is not null 
group by t.Name, t.LimpIsbn, t.CasedIsbn 
order by max(td.OrderDate) desc 

내 코드입니다.

저는 Linq Group에 관한 여러 가지 다른 출처를 살펴 봤습니다.이 그룹은 단일 테이블 그룹과 관련되어 있으며이를 다중 테이블로 변환하는 데 어려움을 겪고 있습니다.

답변

1

귀하의 SQL 쿼리는이 LINQ 쿼리로 변환 할 수 있습니다 거의 같은 :

var query =(from t in Context.Titles 
      join td in Context.TitleDetails on t.id equals td.TitleId into tds 
      from e in tds.DefaultIfEmpty() 
      where e.OrderDate!=null 
      group e.OrderDate by new {t.Name, t.LimpIsbn, t.CasedIsbn} into groups 
      from g in groups 
      select new { Name = m.Key.Name, 
         LimpIsbn = g.Key.LimpIsbn, 
         CasedIsbn = g.Key.CasedIsbm, 
         LastOrder = g.Max(x => x)}) 
      .OrderBy(e=>e.LastOrder).Take(5); 
1

var last5Item = from td in Context.TitleDetails.OrderByDescending(i => i.OrderDate).Take(5) 
       join t in Context.Titles on td.TitleId equals t.id 
       select ..