簡體   English   中英

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

[英]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。 如果您可以使用查詢語法並且不必檢查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;

如果條件中使用的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM