gpt4 book ai didi

c# - Entity Framework 和 lambda 表达式树(深度空合并)

转载 作者:太空狗 更新时间:2023-10-30 00:56:10 26 4
gpt4 key购买 nike

var articles = context.Articles.Where(a => a.Id != articleId)
.OrderBy(p => p.Categories.OrderBy(q => q.Name).FirstOrDefault().Name).ToList();

我得到了正确的可能的 NullReferenceException 消息。

所以我做

var  articles = context.Articles.Where(a => a.Id != articleId)
.OrderBy(p =>
(p.Categories.OrderBy(q => q.Name).FirstOrDefault() != null
? p.Categories.OrderBy(q => q.Name).FirstOrDefault().Name
: null))
.Skip(page * pageSize)
.Take(pageSize)
.ToList();

哪个有效,但是语句调用了两次并且可能很慢,所以我尝试制作

var articles = context.Articles.Where(a => a.Id != articleId)
.OrderBy(p =>
{
var firstOrDefault = p.Categories.OrderBy(q => q.Name).FirstOrDefault();
return firstOrDefault != null ? firstOrDefault.Name : null;
}).ToList();

但是我明白了

lambda expression with a statement body can not be converted to an expression tree.

我能做什么?即使我调用两次 p.Categories.OrderBy(q => q.Name).FirstOrDefault().

,第一个示例也是正确的

我认为这可能会很慢。我在数据库中有 20 万行。

最佳答案

i get message of possible NullReferenceException which is correct.

尚不清楚是哪个系统产生了这条消息。锐化器?

无论如何,在这种情况下,如果这真的是 LINQ to Entities,则警告是虚假的。在许多情况下,LINQ to Entities 会自动执行“深度空合并”,这就是一种情况。

在您的原始查询中:

var articles = context.Articles
.Where(a => a.Id != articleId)
.OrderBy(p => p.Categories
.OrderBy(q => q.Name)
.FirstOrDefault()
.Name)
.ToList();

...如果文章没有与之关联的类别,则不会出现 NullReferenceException。相反,对于此类文章,排序值将被视为 null(这意味着根本没有类别的文章将首先出现),这似乎正是您想要的。因此,您无需付出额外的努力!

请注意,对于其他 LINQ 提供程序(例如 LINQ to Objects),行为可能完全不同,.FirstOrDefault().XXX 确实是一个有风险的表达式。

另一方面,不要过早优化。如果您已经有一个可行的解决方案,请对其进行基准测试。如果速度太慢,请调查原因 - 在这种情况下,线索就在生成的 SQL 中。 LINQ to Entities 查询优化器通常比您想象的更聪明。 :)

关于c# - Entity Framework 和 lambda 表达式树(深度空合并),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8374879/

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