[英]Entity Framework Core LINQ Class Property/Methods can't use Included Property
我有一個帶有導航屬性Settings
的User
類和一個只讀屬性IsVisibleInApp
。
目前,此代碼有效:
var users = context.Users.Include(x => x.Settings)
.Where(x => x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2);
但是我必須經常使用這些檢查,因此我嘗試使用一個屬性,並且它在運行時將Settings
為null。
這是我的代碼。
public bool IsVisibleInApp
{
get
{
return this.Settings.IsApproved && this.Settings.IsAvailable && this.UserType == 2;
}
}
...
...
void SomeMethod(){
var users = context.Users.Include(x => x.Settings)
.Where(x => x.IsVisibleInApp).ToList();
我可以看到外鍵this.SettingsID
是有效值。 我猜屬性/方法不能在DBSets
Where
子句中轉換為SQL時使用? 但是肯定有解決方法...或者我必須先執行.ToList()
然后再使用進一步的.Where
調用,但這將意味着從數據庫中拉出所有行,這似乎有很多額外的作用工作...
您無法按照自己想要的方式進行操作(EF不會進入屬性獲取器並查看您在其中執行的操作),但是可以通過將其包裝在靜態表達式中來減少代碼重復:
public static Expression<Func<User, bool>> IsVisibleInAppExpression = x =>
x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2;
然后像這樣使用:
var users = context.Users.Include(x => x.Settings)
.Where(User.IsVisibleInAppExpression).ToList();
或通過創建擴展方法:
public static class Extensions {
public static IQueryable<User> VisibleInAppOnly(this IQueryable<User> query)
{
return query.Where(x =>
x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2);
}
}
像這樣使用:
var users = context.Users.Include(x => x.Settings).VisibleInAppOnly();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.