簡體   English   中英

LINQ To實體包括+ Where方法

[英]LINQ To Entities Include + Where Method

我有NxN表,想象一下:

用戶(id,...)< - UserAddresses(id,userId,addressId,enabled,...) - >地址(id,...)

UserAddresses包含用戶和地址的FK。 據我所知,實體框架用戶創建的實體包含UserAddresses的集合。 地址包含UserAddresses的集合,特定的UserAddress包含對User和一個Address的重新發送。

現在我想通過linq進行下一個查詢。 對於特定用戶標識,僅獲取已啟用標志設置為true的userAddresses。 對於特定用戶標識,userAddresses可以包含多個條目,但只為此特定用戶設置了一個條目。

我能做的查詢是:

context.User.Include( x => x.UserAddresses )
            .Include( x => x.UserAddresses.Select(y => y.Address) )
            .Single( x => x.id == USER_ID )

但我真正想要的是不為該用戶加載所有UserAddresses ...只包含啟用的那個,設置為TRUE!

有人可以幫我做這個查詢嗎?

EF中沒有辦法部分加載關聯屬性。 嘗試選擇匿名類型,只選擇您需要的內容:

var result = context.User
   .Where(u => u.Id == userId)
   .Select(u => new {
       Addresses = u.UserAddresses.Select(ua => ua.Address)
            .Where(a => a.Enabled),
       User = u // if you need this as well 
   })
   .Single();

這不會加載result.User.UserAddresses,但result.Addresses將具有您想要的。

如果您確實想要將所有內容作為User類的一部分返回,則需要分離result.User,然后更新result.User.UserAddresses以指向result.Addresses。

另一種選擇是使用Load()而不是Include()

var foundUser = context.User.Single(x => x.Id == USER_ID);

context.Entry(foundUser).Collection(u =>
u.UserAddresses).Query().Where(userAddress =>
userAddress.Enabled).Load();

請記住,在某些情況下,EF可以忽略Load()方法:

  1. 如果您使用EF和延遲加載功能,則獲取對象會帶來所有已在類中標記為Virtual的關聯集合。 所以通過context.User.Single( x => x.id == USER_ID ); 您將獲得與用戶關聯的所有UserAddresses,除非您通過從User類中的屬性中刪除Virtual關鍵字來關閉您的集合的延遲加載。

  2. 如果要在程序中添加/刪除UserAddresses集合,則調用context.SaveChanges(); 在不處理上下文的情況下,下次加載User對象時,將從EF上下文緩存中加載UserAddresses集合,而不是從DB(最新更改)加載。 在這種情況下,您需要在從上下文獲取User之前設置上下文並實例化新上下文。 例如,如果您的用戶在UserAddresses集合中有5個項目,並且您禁用其中一個項目( item.Enabled = false ),然后調用context.SaveChanges()而不處理您的上下文,下次獲取User對象時在相同的上下文中,它的集合中已經有5個項目來自上下文緩存,它忽略了你的Load()方法。

PS:

如果應用以下所有條件,則延遲加載功能為ON:

  1. context.Configuration.LazyLoadingEnabled = true;
  2. context.Configuration.ProxyCreationEnabled = true;
  3. UserAddresses已在User類中定義為Virtual。

暫無
暫無

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

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