无法让外部连接在 EF 中工作

Posted

技术标签:

【中文标题】无法让外部连接在 EF 中工作【英文标题】:Can't get outer join to work in EF 【发布时间】:2012-07-29 23:45:39 【问题描述】:

没关系,我用 join/into 语法解决了这个问题。也许这毕竟是必要的

我正在尝试让 Linq 外连接来对抗 EntitiyFramework。

public List<OSCDagbokDTO> FillDataForOSCDagbokSO(List<OSCDagbokDTO> oscdagboklista)

    var kalla_idn = oscdagboklista.Select(k => k.Kalla_id.GetGuidOrNull()).Distinct().ToList();
    var kallaLista = (from k in _gemensamEntityContext.Kalla
                      where kalla_idn.Contains(k.Kalla_id)
                      select new KallaDTO()
                      
                          Kalla_id = k.Kalla_id,
                          KallaText = k.KallaText
                      ).ToList();

    var nyOSCDagbokLista = (from o in oscdagboklista
                            from k in kallaLista.DefaultIfEmpty()
                            where o.Kalla_id.GetGuidOrNull() == k.Kalla_id
                            select new OSCDagbokDTO()
                            
                                Id = o.id,
                                Datum = o.Datum,
                                Enhet_id = o.Enhet_id,
                                Handelse = o.Handelse,
                                Kalla = k,
                                Kalla_id = o.Kalla_id,
                            ).ToList();
    return nyOSCDagbokLista;

第一个语句是从传入列表中的属性获取 id 列表。

第二个,从该列表创建 DTO 对象。

第三个,使用(如我所想的)外连接从传入列表中获取所有项目,与 DTO 列表(kallaLista)连接。我正在使用 DefaultIfEmpty(),我认为它不会从传入列表中过滤掉项目,但确实如此!

我没有使用“join”语法,因为我从各个网站都了解过,上面的语法应该没问题,我更喜欢它,即使它更老式。

我错过了什么,为什么当使用 DefaultIfEmpty() 时,传入列表中的项目不在 DTO 列表中时会被过滤掉?

【问题讨论】:

【参考方案1】:

如果存在从父实体到子集合的导航属性,我是否可以补充一点,执行外部连接的方法非常简洁?

假设您有一个实体OSCDagbok(我只是猜测单数形式),其导航属性为kallaLista。然后你可以这样做:

from o in oscdagboklista
from k in o.kallaLista.DefaultIfEmpty() // mind the "o."
select new OSCDagbokDTO()
...

如果没有,您可以按照您的解决方案进行操作。 intojoin 转换为 GroupJoin,这相当于外连接的 linq。

【讨论】:

我认为那是我错过的事情,而不是使用“o”。而是另一个列表!

以上是关于无法让外部连接在 EF 中工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPQL 连接不相关的实体在休眠 5.3.2 中无法在 Spring 数据中工作

如何让 ScrollViewer 在 StackPanel 中工作?

通过慢速网络连接在 git 中工作的最快方法是啥?

web.config 中到一个 SQL DB 的两个连接字符串在调试中工作,但在发布时不工作

如何让 splice() 方法在我的待办事项列表中工作?

让 Jest 全局设置和全局拆卸在打字稿项目中工作