2017-03-01 105 views
1

我试图重复使用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已()的例子,但是这不是一个选项,因为家长是一条记录。我确信我错过了一些明显的事情,我很抱歉,因为我的谷歌foo今天没有提出答案。

回答

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"); 
+1

谢谢你的答案显然我失踪。另外感谢新项目的调查。 –