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

C# 实体框架-重用相关的扩展方法,c#,entity-framework-6,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;

我正在尝试使用关联实体(一对多关系)重用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");
公共类父类
{
公共字符串状态{get;set;}
公共ICollection子项{get;set;}
}
公营儿童
{
公共字符串值{get;set;}
公共父级{get;set;}
}
公共静态ParentNamedScopes
{
公共静态IQueryable已就绪(此IQueryable可查询)
{
返回queryable.Where(p=>p.State==“Ready”| | p.State==“New”);
}
}
// ...
var children=db.children
//我的目标,但不能把父母投给我
//---------v
.Where(c=>c.Parent.IsReady())
其中(c=>c.Value==“Foobar”);

我见过在子查询的关联集合上使用AsQueryable()的例子,但这不是一个选项,因为父项是一条记录。我确信我遗漏了一些明显的东西,我很抱歉,因为我的google foo今天没有找到答案。

一个选择是从家长那里开始查询:

var children = db.Parents.IsReady()
    .SelectMany(p => p.Children)
    .Where(c => c.Value == "Foobar");
不过,
IsReady
可以转换IQueryable的想法对我来说似乎有点不合适。如果您的用例变得更复杂,您可能需要更改它,以便只为您提供一个
表达式
,并使用类似操作的方法来操作查询以使其可重用:

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");
表达式parentIsReady=ParentCriteria.IsReady(); var readyParents=db.Parents.Where(parentIsReady); var childrenWithReadyParents=db.Children.AsExpandable() .Where(c=>parentIsReady.Invoke(c.Parent)) 其中(c=>c.Value==“Foobar”);
谢谢你给了我一个显而易见的答案。再次感谢您对新项目的调查。