2017-09-26 75 views
1

我想過濾掉表(UserRoles.IsDeleted == false)的第二部分。有什麼建議我怎麼能做到這一點?Linq - 試圖過濾出渴望的選擇

var Users = context.Users.Where(r => r.IsDeleted == IsDeleted).ToList<User>(); 
Users = context.Users.Include(x => x.UserRoles.Select(y=>y.IsDeleted==false)).ToList(); 

謝謝

+0

不完全確定你想要完成什麼。如果這是一個問題,你可以關閉延遲加載,或者如果這是你想要實現的,你可以加入UserRoles。 – BurnsBA

回答

0

您可以執行以下操作使用第二部分進行過濾:

var Users = context.Users.Where(r => r.IsDeleted == IsDeleted).ToList<User>(); 

if(condition) 
{ 
    Users = Users.where(y => y.IsDeleted == false)).ToList(); 
} 
0

有兩個選項來過濾相關的實體

做一個投影。 不幸的是,當您使用Include方法時,您無法按照您的意願過濾相關實體。您需要將您的查詢投影到DTO對象或匿名對象,如下例所示。

var query=context.Users.Include(x => x.UserRoles) 
         .Where(r => r.IsDeleted == IsDeleted) 
         .Select(u=> new{ ..., 
             Roles=x => x.UserRoles.Where(y=>!y.IsDeleted)}) 

第二個選項可以使用Explicitly Loading。但是,如果您可以加載一個特定實體的相關實體,例如。

var user=context.Users.FirstOrDefault(r.IsDeleted == IsDeleted);//Getting a user 

context.Entry(user) 
     .Collection(b => b.UserRoles) 
     .Query() 
     .Where(y=>!y.IsDeleted) 
     .Load(); 

爲此,您可以按照您第一個查詢獲取每個實體的foreach內,

var query=context.Users.Where(r => r.IsDeleted == IsDeleted); 
foreach(var u in query) 
{ 
    context.Entry(u) 
     .Collection(b => b.UserRoles) 
     .Query() 
     .Where(y=>!y.IsDeleted) 
     .Load(); 

} 

,但它的將是真正低效的,因爲你要做一個往返到您的數據庫每個實體。我的建議是使用第一個選項,投影查詢。