gpt4 book ai didi

c# - 我可以在 Where() 中使用 FirstOrDefault() 或 First()

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

我正在尝试实现这个查询:

 data.Where(d => d.ObjectsA != null && 
d.ObjectsA.First().ObjectsB != null &&
d.ObjectsA.First().ObjectsB().First().Nr == 1)

在 Nhibernate.Linq 中,但出现错误。当我从 Where() 中删除 First() 时,一切正常。我尝试了这个解决方案,但这没有得到我需要的。

 data.Where(d => d.ObjectsA.Where(a.ObjectsB.Where(b=>b.Nr == 1).Any()).Any());

我可以在 Where() 中使用 FirstOrDefault() 或 First() 吗?

编辑:在我的数据库表中,此示例中的所有行都没有空值。

最佳答案

First()如果集合为空,将抛出异常。使用Any()在您的 Where() 调用中确实应该可以解决问题,但是您必须编写如下内容:

data.Where(d => d.ObjectsA != null && d.ObjectsA.Any()
&& d.ObjectsA.First().ObjectsB != null && d.ObjectsA.First().ObjectsB.Any()
&& d.ObjectsA.First().ObjectsB.First().Nr == 1);

这不是很好,因为 First() 最终会针对同一数据被多次调用。我建议在您的 lambda 表达式中添加一个正文,并使用 FirstOrDefault() 的中间变量:

data.Where(d => {
if (d.ObjectsA != null) {
var firstA = d.ObjectsA.FirstOrDefault();
if (firstA != null && firstA.ObjectsB != null) {
var firstB = firstA.ObjectsB.FirstOrDefault();
if (firstB != null) {
return (firstB.Nr == 1);
}
}
}
return false;
});

编辑:上面的第二个代码片段显然不适用于 LINQ to NHibernate。如果您可以使用查询语法并且不必检查 ObjectsAObjectsB 是否为 null,您可以这样写:

from d in data
let firstA = d.ObjectsA.FirstOrDefault()
let firstB = (firstA != null ? firstA.ObjectsB.FirstOrDefault() : null)
where (firstB != null && firstB.Nr == 1)
select d;

关于c# - 我可以在 Where() 中使用 FirstOrDefault() 或 First(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5833579/

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