簡體   English   中英

實體框架-重用關聯的擴展方法

[英]Entity Framework - reusing associated extension methods

我正在嘗試將EF6擴展方法與關聯的實體(一對多關系)重用。 人為的例子:

public class Parent 
{
   public string State { get; set; }
   public ICollection<Child> Children { get; set; }
}

public class Child
{
   public string Value { get; set; }
   public Parent Parent { get; set; }
}

public static ParentNamedScopes
{
   public static IQueryable<Parent> IsReady(this IQueryable<Parent> queryable) 
   {
      return queryable.Where(p => p.State == "Ready" || p.State == "New");
   }
}

// ...

var children = db.Children
   // my goal, but can't cast Parent to IQueryable<Parent>
   // ------------------v
   .Where(c => c.Parent.IsReady())
   .Where(c => c.Value == "Foobar");

我已經看到了在子查詢中的關聯集合上使用AsQueryable()的示例,但這不是一個選項,因為Parent是單個記錄。 我敢肯定我遺漏了一些明顯的東西,對不起,因為我的Google foo今天還沒有給出答案。

一種選擇是從“父母”開始查詢:

var children = db.Parents.IsReady()
    .SelectMany(p => p.Children)
    .Where(c => c.Value == "Foobar");

但是, IsReady會轉換IQueryable的想法對我來說似乎有點IsReady 如果您的用例變得更加復雜,則可能需要對其進行更改以僅提供一個Expression<Func<Parent, bool>> ,並使用類似LINQKit的方法來操縱您的查詢以使其可重用:

Expression<Func<Parent, bool>> parentIsReady = ParentCriteria.IsReady();
var readyParents = db.Parents.Where(parentIsReady);
var childrenWithReadyParents = db.Children.AsExpandable()
   .Where(c => parentIsReady.Invoke(c.Parent))
   .Where(c => c.Value == "Foobar");

暫無
暫無

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

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