gpt4 book ai didi

c# - 使用内联对象初始化器与将变量 1 传递给 EF Select 的细微差别

转载 作者:行者123 更新时间:2023-11-30 21:03:08 24 4
gpt4 key购买 nike

将 Func 保存为变量然后将其传递给 Entity Framework 选择与在选择内输入内联转换有什么区别。

Func<Models.Contact,ViewModels.Contact> ToViewModel = 
c => new ViewModels.Contact()
{
ID = c.ID,
...
UserName = c.User.UserName
};

...

return dc.Contacts.Select(ToViewModel);

相对于

return dc.Contacts.Select(c => new ViewModels.Contact()
{
ID = c.ID,
...
UserName = c.User.UserName
});

我问这个是因为虽然这两种方法都有效,但它们对 null 和其他一些东西的 react 略有不同,我不明白为什么。

例如,在这种情况下,联系人可能有也可能没有用户,因此用户可能为空也可能不为空。当输入内联初始化程序时,它会使属性优雅地失败为 null。但是,当通过变量传递相同的初始值设定项时,它将抛出 NullReferenceException。

这是为什么?

请注意,我要保存初始化程序的原因是,它可以在每个 CRUD 操作中重复使用,以从 WebApi 返回对象。必须在类周围复制和粘贴选择会很烦人,特别是如果随着时间的推移需要从响应中添加或删除属性。

最佳答案

您的第二个示例编译为 Expression<Func<Contact, Contact>> ,其中 EF 在服务器上运行。 (使用 IQueryable 接口(interface))
它变成了使用 OUTER JOIN 的 SQL 查询,不会产生空引用异常。

您的第一个示例不是表达式树,因此它遍历 IEnumerable<T>接口(interface)并在客户端执行。
您可以通过更改 ToViewModel 使其行为与第一个示例相同到Expression<Func<...>> .

关于c# - 使用内联对象初始化器与将变量 1 传递给 EF Select 的细微差别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13014872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com