2011-07-22 9 views
5

ここには何かがあります。エンティティフレームワークをもたらす方法汎用IQueryableにエクステンションメソッドを含める<TSource>

私はインターフェイスを持っている、と私はいけないが、EntityFrameworkについてを知っている必要があり、私のIRepository層ウィッヒに、EntityFrameworkライブラリに属しInclude拡張メソッドを、置くことでしょう。

public interface IRepository<TEntity> 
{ 
    IQueryable<TEntity> Entities { get; } 

    TEntity GetById(long id); 
    TEntity Insert(TEntity entity); 
    void Update(TEntity entity); 
    void Delete(TEntity entity); 
    void Delete(long id); 
} 

だから私は、拡張メソッドがあります。

public static class IncludeExtension 
{ 
    static IQueryable<TEntity> Include<TEntity>(this IQueryable<TEntity> query, 
     string path) 
    { 
     throw new NotImplementedException(); 
    } 
} 

をしかし、私はこの層にそれを実装する方法がわからない、と私は考え私のEntityFrameworkに送信する(または誰が実装するものは何でもIRepository)に対処する。

拡張メソッドを持つインタフェースと同じものが必要です。

答えて

2

この質問は少し古いですが、ここでは2 EF-独立したソリューションは、あなたや他の誰が、まだ探している場合は、次のとおりです。

1.リフレクションベースのソリューション

この解決策は何ですか。 IQueryableDbQueryまたはObjectQueryにキャストされない場合、NET Frameworkは元に戻ります。これらのキャスト(およびそれが提供する効率)をスキップし、ソリューションをEntity Frameworkから切り離しました。

public static class IncludeExtension 
{ 
    private static T QueryInclude<T>(T query, string path) 
    { 
     MethodInfo includeMethod = query.GetType().GetMethod("Include", new Type[] { typeof(string) }); 

     if ((includeMethod != null) && typeof(T).IsAssignableFrom(includeMethod.ReturnType)) 
     { 
      return (T)includeMethod.Invoke(query, new object[] { path }); 
     } 

     return query; 
    } 

    public static IQueryable<T> Include<T>(this IQueryable<T> query, string path) where T : class 
    { 
     return QueryInclude(query, path); 
    } 

    // Add other Include overloads. 
} 

2 Dyanmics系溶液ここ

QueryInclude<T>方法は、反射を避けるためにdynamicタイプを使用します。

public static class IncludeExtension 
{ 
    private static T QueryInclude<T>(T query, string path) 
    { 
     dynamic querytWithIncludeMethod = query as dynamic; 

     try 
     { 
      return (T)querytWithIncludeMethod.Include(path); 
     } 
     catch (RuntimeBinderException) 
     { 
      return query; 
     } 
    } 

    public static IQueryable<T> Include<T>(this IQueryable<T> query, string path) where T : class 
    { 
     return QueryInclude(query, path); 
    } 

    // Add other Include overloads. 
} 
3

Includeは、漏れ抽象であり、Entityフレームワークでのみ動作します。 EF 4.1 already containsIncludeオーバーオールIQueryableですが、内部で渡されたジェネリックIQueryableのみを汎用ObjectQueryまたはDbQueryに変換し、Includeと呼びます。

include in repositoryをラップする方法の例です(リポジトリの実装はEFに依存するため、EFが直接提供するIncludeを使用できます)。

+0

私はちょうどEFでdepedingしたくありません。私はクライアント層の参照を避けようとしています。 – iuristona

0

Entity Framework 5.0では、Include機能を追加するための拡張メソッドをIQueryableに提供するようになりました。拡張メソッドを解決するには、単に "System.Data.Entity"を使用して追加する必要があります。直接の文書化のためにhere

関連する問題