C# 实体框架-重用相关的扩展方法
我正在尝试使用关联实体(一对多关系)重用EF6扩展方法。人为的例子: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;
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”);
谢谢你给了我一个显而易见的答案。再次感谢您对新项目的调查。