2017-03-01 6 views
1

EF6拡張メソッドを関連エンティティ(1対多の関係)で再利用しようとしています。不自然な例:エンティティフレームワーク - 関連する拡張メソッドの再利用

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()を使用しての例を見てきましたが、親は、単一のレコードですので、それはオプションではありません。私は明らかな何かを見逃していると確信して、私はGoogleのfooが今日答えを立てていないので謝罪します。

答えて

2

1つのオプションは、両親とあなたのクエリを開始するには、次のようになります。

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

は、私が行方不明になった明白な答えをありがとう:あなたのユースケースはより複雑になった場合、あなただけのあなたのExpression<Func<Parent, bool>>を与え、そしてそれを再利用可能にするために、あなたのクエリを操作するためLINQKitようなものを使用することを変更する必要があります。調査する新しいプロジェクトにもう一度感謝します。 –

関連する問題