C# Linq 表达式左连接

268 阅读1分钟

使用 GroupJoin 左连接 和 Join 内连接

GroupJoin 链接,需要SelectMany 查询一下,否则会报错, GroupJoin 如果被链接的表不匹配仍然显示左表的数量,Join 只显示两个表匹配成功的数量

Lambda 表达式写法:

var result = _context.Set<SiteErrorCode>().GroupJoin(_context.Set<Languages>(), u => u.LanguageId, lang => lang.Id, (u, lang) => new {  u, lang })
                .SelectMany(e => e.lang.DefaultIfEmpty(), (e,lang) => new SiteErrorCodeDto
                {
                    Id = e.u.Id,
                    Title = e.u.Title,
                    CallIndex = e.u.CallIndex,
                    SortId = e.u.SortId,
                    Description = e.u.Description,
                    JsonData = e.u.JsonData,
                    LanguageId = e.u.LanguageId,
                    Language = lang.Title,
                }).Where(funcWhere).OrderByBatch(orderBy);

查询表达式写法, join 和 left join 的区别在于,left join 多了一句
into d_join from t_d in d_join.DefaultIfEmpty()
示例:

 var result = from ms in _context.Set<MembersContractReceiptHistory>()
                     join mc in _context.Set<MembersContract>() on ms.ContractId equals mc.Id into mc_join
                     from t_mc in mc_join.DefaultIfEmpty()
                     join d in _context.Set<Dictionaries>() on ms.Mode equals d.Id into d_join
                     from t_d in d_join.DefaultIfEmpty()
                     select new MembersContractReceiptHistoryDto()
                     {
                         Amount = ms.Amount,
                         ContractId = ms.ContractId,
                         Mode = ms.Mode,
                         ModeName = t_d.Title,
                         Contract = ms.Contract,
                         ContractNo = t_mc.ContractNo,
                         Id = ms.Id,
                         MemberId = t_mc.MemberId,
                         ReceiptNo = ms.ReceiptNo,
                         ReceiptTime = ms.ReceiptTime,
                         Remark = ms.Remark,

                     };