[英]Can I use FirstOrDefault() or First() inside Where()
我正在嘗試實現此查詢:
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() 嗎?
編輯:在我的數據庫表中,此示例中的所有行都沒有 null 值。
如果集合為空, First()將拋出異常。 在Where()
調用中使用Any()確實可以解決問題,但是您必須編寫如下內容:
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 到 NHibernate。 如果您可以使用查詢語法並且不必檢查ObjectsA
和ObjectsB
是否為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;
如果條件中使用的 collections 可以為空,則可以使用默認變量和?? 帶有 FirstOrDefault() 的 nullif 運算符。
var defaultA = new ObjectA();
var defaultB = new ObjectB();
var defaultBList = new List<ObjectB>();
data.Where(d => d.ObjectsA != null &&
((d.ObjectsA.FirstOrDefault() ?? defaultA).ObjectsB ?? defaultBList)
.FirstOrDefault() ?? defaultB).Nr == 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.