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