实体框架 - 重用相关的扩展方法

时间:2017-03-01 18:36:15

标签: c# entity-framework-6

我试图将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今天没有找到答案。

1 个答案:

答案 0 :(得分:2)

一种选择是与父母一起开始查询:

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

IsReady转换IQueryable的想法似乎对我来说有点不合适。如果您的用例变得更复杂,您可能需要将其更改为仅提供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");