如何在 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 中的第二个表上实现具有某些条件的左连接?的主要内容,如果未能解决你的问题,请参考以下文章

两个对象的EF Core保存错误取决于第二个等于一个

使用 LINQ 查询语法 EF Core C# 的左外连接

EF Core多对多查询加入3个表

访问数据视图中的第二个表

EF Core 左连接计数

销售车中的 EF Core 多对多唯一键关系问题