没关系,我改用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列表中时被过滤掉?

最佳答案

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

假设您有一个具有导航属性OSCDagbok的实体kallaLista(我只是在猜测单数形式)。然后,您可以执行以下操作:

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


如果没有,您可以按照您的解决方案进行操作。 intojoin转换为GroupJoin,这是外部联接的linq等效项。

关于c# - 无法获得外部联接以在EF中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11753163/

10-12 12:44
查看更多