簡體   English   中英

在帶有倍數的linq查詢的.include()內部使用.Where()子句

[英]Using .Where() clause inside an .Include() on a linq query with multiples includes

我想獲取一個Customer集合,包括幾個屬性,其中包括地址,但僅當它尚未被刪除時( SuppressionDate == null

IQueryable<Customer> customers =
    context.Persons.OfType<Customer>()
        .Include(customer => customer.Addresses)
        .Include(customer => customer.Bills)
        .Include(customer => customer.Code)
        .Include(customer => customer.Tutors);

我嘗試了幾種使用where子句來過濾地址的方法:

...
.Include(customer => customer.Addresses.Where(a => a.SuppressionDate == null))
.Include(customer => customer.Bills)
...

那是我的第一次嘗試,但它引發了以下異常:

System.ArgumentException:包含路徑表達式必須引用在類型上定義的導航屬性。 使用虛線路徑作為參考導航屬性,使用“選擇”運算符作為集合導航屬性。 參數名稱:路徑

我還嘗試了在Include()末尾和查詢末尾使用相同的where子句,但似乎都不起作用。

我目前正在使用一種變通方法,該方法遍歷客戶集合並刪除這樣刪除的地址:

foreach(Customer c in customers){
    customer.Addresses = customer.Addresses.Where(a => a.SuppressionDate == null).ToList();
}

對於linq對象/實體來說,我還很陌生,我想知道是否有內置的方法來實現這一目標。

如果您獲得單個客戶,則可以使用如下所示的顯式加載:

var customer = context.Persons
    .OfType<Customer>()
    .Include(customer => customer.Bills)
    .Include(customer => customer.Code)
    .Include(customer => customer.Tutors)
    .FirstOrDefault(); //or whatever

context.Entry(customer).Collections(x => x.Addresses).Query().Where(x => x.SuppressionDate == null).Load();

這是一個很好的查詢,並且對數據庫進行了兩個簡單的調用。 但是在這種情況下,您將獲得一份客戶列表(或集合或其他內容),並且沒有捷徑。 您的“解決方法”可能會引起數據庫混亂。

因此,您可能只需要一次采取以下步驟:

//1. query db to get customers
var customers = context.Persons
    .OfType<Customer>()
    .Include(customer => customer.Bills)
    .Include(customer => customer.Code)
    .Include(customer => customer.Tutors)
    .ToList();

//2. make an array of all customerIds (no db interation here)
var customerIds = customers.Select(x => x.CustomerId).ToArray();

//3. query db to get addresses for customers above
var addresses = context.Addresses.Where(x => customerIds.Contains(x.CustomerId).ToList();

//4. assign addresses to customers (again, no db chatter)
foreach (var customer in customers) 
{
    customer.Addresses = addresses
        .Where(x => x.CustomerId == customer.CustomerId && x.SuppressionDate == null)
        .ToList();
}

還不錯-仍然只有兩個對數據庫的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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