涉及多个 GroupJoin 的 SQL 到 LINQ

问题描述

我有一个 sql 查询,想转换为 LINQ 方法语法 (Lambda),但似乎我被困在多组连接中,这让我很困惑。 下面是我想改成LINQ的sql

select MerchantUserId,usex.Nickname,MAX(OrderTransaction.CreatedDate) as LastOrderDate,sd.Url,st.Name as storename
from OrderTransaction
    left join UserExtend usex
    on usex.Id = OrderTransaction.MerchantUserId
    left join StoreDomain sd 
    on sd.StoreId = usex.StoreId
    left join store st
    on st.id = sd.StoreId
where OrderTransaction.Status <> 8
    and sd.IsPrimary = 1    
group by MerchantUserId,st.Name
order by LastOrderDate desc

下面是我尝试将所有三个表链接在一起的查询。在将 3 个表链接在一起方面,我做得对吗?

    var list = _ApplicationDbContext.UserExtend
.GroupJoin(_ApplicationDbContext.OrderTransaction,usex => usex.Id,ord => ord.MerchantUserId,(usex,ord) => new { usex,ord})
.GroupJoin(_ApplicationDbContext.StoreDomain,usexOrd => usexOrd.usex.StoreId,sd => sd.StoreId,(usexOrdStoreDom,sd) => new { usexOrdStoreDom,sd})
.GroupJoin(_ApplicationDbContext.Store,usexOrdStoreDom => usexOrdStoreDom.usexOrdStoreDom.usex.StoreId,st => st.Id,(usexOrdStoreDomStore,st ) => new { usexOrdStoreDomStore,st })

解决方法

与您的 SQL 查询等效的是以下链接短语。 GroupJoin 用于将一个值与多个值匹配。

更多信息,您可以参考此链接:Linq to Entities join vs groupjoin

var list = _ApplicationDbContext.UserExtend.Join(_ApplicationDbContext.OrderTransaction,usex => usex.Id,ord => ord.MerchantUserId,(usex,ord) => new { usex,ord })
      .Join(_ApplicationDbContext.StoreDomain,usexOrd => usexOrd.usex.StoreId,sd => sd.StoreId,(usexOrd,sd) => new { usexOrd,sd })
      .Join(_ApplicationDbContext.Store,usexOrdStoreDom => usexOrdStoreDom.sd.StoreId,st => st.Id,(usexOrdStoreDom,st) => new { usexOrdStoreDom,st })
      .GroupBy(a => new { a.usexOrdStoreDom.usexOrd.ord.MerchantUserId,a.usexOrdStoreDom.usexOrd.usex.Nickname,a.usexOrdStoreDom.sd.Url,a.st.Name,a.usexOrdStoreDom.usexOrd.ord.CreatedDate })
      .OrderBy(a => a.Key.CreatedDate)
      .Select(a => new
      {
         MerchantUserId = a.Key.MerchantUserId,Nickname = a.Key.Nickname,Url = a.Key.Url,storename = a.Key.Name,LastOrderDate = a.Max(x => x.usexOrdStoreDom.usexOrd.ord.CreatedDate)
      })
      .ToList();