仅当不为空时,如何使用 Include() 进行急切加载?

the*_*eal 6 c# sql entity-framework

我正在尝试做:

var abc = Context.PersonSet.Include(p=>p.Child).ToList();
Run Code Online (Sandbox Code Playgroud)

但并不是所有的人都有孩子。所以我得到:

类型错误 我想得到所有的人,如果孩子不为空,我想包括它。将 Child 包含为 null 也可以。

小智 6

返回空子级而不是 null

 Context.PersonSet.Include(a => ((a.Child == null) ? new Collection<Child>() : a.Child));
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个,而不是为模型中的属性提供默认的空集合,因为现在您仍然可以轻松判断数据库中何时确实有 DB NULL。 (2认同)

Cod*_*ter 6

我不知道为什么人们一直在为这样的解决方案投票:

Include(p => p.NavProp ?? new List<NavPropType>())
Run Code Online (Sandbox Code Playgroud)

因为那行不通,所以对以下情况无效Include()

无效操作异常:

Include 属性 lambda 表达式p => (p.NavProp ?? value(System.Collections.Generic.List'1[NavPropType]))无效。该表达式应表示属性访问:t => t.MyProperty

要定位在派生类型上声明的导航,请指定目标类型的显式类型化 lambda 参数,例如(Derived d) => d.MyProperty。有关包含相关数据的详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=746393

解决方案:使用默认值声明您的属性:

public class Foo
{
    public List<Bar> Bars { get; set; } = new List<Bar>();
}
Run Code Online (Sandbox Code Playgroud)

这可以确保Bars不会null在没有找到相关记录。