如何在 EF / EF Core 中的第二个表上实现具有某些条件的左连接?
Posted
技术标签:
【中文标题】如何在 EF / EF Core 中的第二个表上实现具有某些条件的左连接?【英文标题】:How to implement a left join with some condition on second table in EF / EF Core? 【发布时间】:2019-07-10 21:26:42 【问题描述】:当B有Where子句时,如何从A表中选择数据(整行)与B表连接?
我需要的正是这样的 SQL 代码:
select * from HISBaseInsurs i left join (select * from HISBaseCenterCodeSends h where h.ServiceGroupID = 4 and h.CenterCode = 2) s on i.ID = s.InsurID
结果:
ID Name ID CenterCode ServiceGroupID InsurID CodeSend WebServiceAddress WebServicePassword WebServiceUserName
----------- -------------------------------------------------- ----------- ----------- -------------- ----------- --------------- ---------------------------------------------------------------------------------------------------- -------------------------------------------------- --------------------------------------------------
1 a 2 2 4 1 asd6541 www.x.com 23d asda
2 b NULL NULL NULL NULL NULL NULL NULL NULL
3 c NULL NULL NULL NULL NULL NULL NULL NULL
4 d NULL NULL NULL NULL NULL NULL NULL NULL
现在我想让这些像实体列表一样。我所做的是:
list = HISBaseInsurs.Include(s => s.CenterCodeSends.Where(x => x.Center.CenterCode == 2 && x.ServiceGroup.ID == 4)).ToList();
但是这个解决方案有一个例外。异常消息是:
Include 属性 lambda 表达式的 => from HISBaseCenterCodeSend x in s.CenterCodeSends where (([x].Center.CenterCode == 2) AndAlso ([x].ServiceGroup.ID == 4)) 选择 [x]' 无效。表达式应该代表一个属性 访问:'t => t.MyProperty'。定位在派生上声明的导航 类型,指定目标的显式类型 lambda 参数 类型,例如'(派生 d)=> d.MyProperty'。有关更多信息 包括相关数据,见 http://go.microsoft.com/fwlink/?LinkID=746393.
我该如何解决这个问题?
【问题讨论】:
请分享域类。 首先,你的 sql 查询可以写成select * from HISBaseInsurs i left join HISBaseCenterCodeSends h on s on i.ID = h.InsurID where h.ServiceGroupID = 4 and h.CenterCode = 2
,其次看这些 ***.com/a/23558389/2343086 和 ***.com/a/3413698/2343086
@abdulqayyum 正如我所说,我想选择表 A 的所有行。但是您编写的选择只选择接受条件的行。
也许我的SQL to LINQ Recipe 会帮助你?
【参考方案1】:
类似:
var filteredCenterCodeSends = dbContext.HISBaseCenterCodeSends
.Include( ccs => ccs.Insur ) // assuming navigation property name
.Where( ccs =>
ccs.Center.CenterCode == 2
&& ccs.ServiceGroup.ID == 4 );
// if ccs.Insur/ID is nullable, also add `&& ccs.Insur != null`
var insurersWithFilteredCcs = dbContext.HISBaseInsurs
.GroupJoin( filteredCenterCodeSends,
insr => insr,
ccs => ccs.Insur,
(insr, ccsCollection) =>
new
Insur = insr,
FilteredCenterCodeSends = ccsCollection,
);
【讨论】:
以上是关于如何在 EF / EF Core 中的第二个表上实现具有某些条件的左连接?的主要内容,如果未能解决你的问题,请参考以下文章