簡體   English   中英

實體框架核心LINQ類屬性/方法不能使用Included屬性

[英]Entity Framework Core LINQ Class Property/Methods can't use Included Property

我有一個帶有導航屬性SettingsUser類和一個只讀屬性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.

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