2009-07-27 6 views
8

私はEntity FrameworkのDataContext.GetTable<TEntity>と同等のものを探しています。 私はObjectContext.CreateQuery<T>メソッドを見つけましたが、動作するにはクエリ文字列が必要なので、DataContext.GetTable<TEntity>とは異なります。Entity Frameworkには、Linq2Sql(ObjectContext.CreateQuery <T>?)のDataContext.GetTable <TEntity>と同等のものがあります

クエリ文字列を指定せずにエンティティタイプを使用してテーブルのIQueryableオブジェクトを取得する方法はありますか?

*EDIT: Added code snippet*
これは、linq2sqlで動作する実装済みのRepositoryクラスのスニペットです。私はObjectContext.[TableName]を使用することはできません。なぜならそれはもはや一般的ではないからです。

public class BaseRepository<TClass> : IDisposable 
     where TClass : class 
    { 
     protected BaseRepository(DataContext database) 
     { 
      _database = database; 
     } 
     ... 

     public IQueryable<TClass> GetAllEntities() 
     { 
      IQueryable<TClass> entities = _database.GetTable<TClass>(); 
      return entities; 
     } 

     public IQueryable<TClass> GetEntities(Expression<Func<TClass, bool>> condition) 
     { 
      IQueryable<TClass> table = _database.GetTable<TClass>(); 
      return table.Where(condition);  
     } 

*EDIT: Added my solution (so far..)*
これは私が使用しているものです:

public IQueryable<TClass> GetEntities(Expression<Func<TClass, bool>> condition) 
{ 
    IQueryable<TClass> table = _database.CreateQuery<TClass>(typeof(TClass).Name); 
    return table.Where(condition);  
} 

これがある限り、クラス名はテーブル名と同じであるとして動作します。これは、私が同じテーブルに対して異なるオブジェクトを使用し始めるとき、私にとっては問題になります。

私は
マルコ、事前のおかげで、私は明確にしてきた願っています:)

+0

マルコB:しかし、あなたはそれを古い大学試してみることができますか?私は同じ問題を抱えていて、 "[EntitySet]"をパラメータとしてCreateQueryに渡すことさえできません。 –

+2

私はこの回答を最初に見つけました。その後、[この回答](http://stackoverflow.com/questions/7263083/gettable-equivalent-for-objectcontext)。 Linq2SQLの 'GetTable'に似た簡単な方法があります。 –

答えて

6

実際には、EFデザイナー自身がCreateQueryを使用し、静的参照にハードコード文字列を使用しています。あなたが別のエンティティセットの同じエンティティタイプを使用することができますので、

public global::System.Data.Objects.ObjectQuery<Customers> Customers 
{ 
    get 
    { 
     if ((this._Customers == null)) 
     { 
      this._Customers = base.CreateQuery<Customers>("[Customers]"); 
     } 
     return this._Customers; 
    } 
} 

private global::System.Data.Objects.ObjectQuery<Customers> _Customers; 

技術的に完璧な解決策はありません:あなたはデザイナーのファイルに掘る場合は、このようなものが表示されます。あなたが解決策を発見した、

public IQueryable<TEntity> GetEntities<TEntity>() 
{ 
    Type t = typeof(TEntity); 
    var edmAttr = (EdmEntityTypeAttribute)Attribute.GetCustomAttribute(t, 
     typeof(EdmEntityTypeAttribute), false); 
    if (edmAttr == null) // Fall back to the naive way 
    { 
     return context.CreateQuery<TEntity>(t.Name); 
    } 
    var ec = context.MetadataWorkspace.GetEntityContainer(
     context.DefaultContainerName, DataSpace.CSpace); 
    var entityType = context.MetadataWorkspace.GetType(edmAttr.Name, 
     edmAttr.NamespaceName, DataSpace.CSpace); 
    var es = ec.BaseEntitySets.First(es => es.ElementType == entityType); 
    return context.CreateQuery<TEntity>(es.Name); 
} 
+0

ありがとうございます。 今日、私はcodeplex(http://kigg.codeplex.com)のkiggプロジェクトで同様のソリューションを見つけました。 – marcob

+0

このコードを使用しようとしましたが、問題はBaseEntitySets.FirstがIQueryableでないため、他の人がこの例をどのように処理しているかわかりません。 –

+0

私はこの質問を更新する必要があると思います。質問をしている人が答えを受け入れたように見えるので、答えは混乱しています。実際にはQuestionerは 'return context.CreateQuery (t.Name);コードだけを使用していますが、私が気付かずに受け入れられたAnswerを動作させるのに数時間を費やしました。私がCreateQueryメソッドを使用するように切り替えるとすぐに、それは完全に機能します。 –

0

私はポイントを逃していないんだけど、それはないだろう願っています:

ObjectContext.TableName 

TableNameは、操作したいタイプのEntitySetです。

+0

こんにちは、私はテーブルにアクセスする一般的な方法を持っているので、テーブル名を使いたくありません。 達成したいことをよりよく説明するために、私のクラスからコードスニペットを追加しました。 今私が想像できる唯一の解決策は、ObjectContext.CreateQuery メソッドを使用して、コンストラクタに渡すジェネリッククラスの構造を少し変更することです。 – marcob

1
public IQueryable GetTable<T>(T entity) where T : class 
{ 
    return context.CreateObjectSet<T>(); 
} 
関連する問題