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