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

时间:2012-08-01 05:42:36

标签: c# linq entity-framework linq-to-entities outer-join

没关系,我用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;
}

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我是否可以补充说,如果从父实体到子集合有导航属性,有一种非常简洁的方式来执行外连接?

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

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

如果没有,您可以按照您的解决方案。 intojoin变为GroupJoin,这是外连接的linq等价物。