Entity FrameworkにはDataContext.GetTableと同等のものがありますか Linq2Sql(ObjectContext.CreateQueryから) ?)

.net c# entity-framework

質問

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

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

*EDIT: Added code snippet*
これは私が実装したリポジトリクラスの一部で、linq2sqlで動作します。 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);    
}

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

私ははっきりしていることを願っています、事前に感謝します、
マルコ:)

受け入れられた回答

実際には、EF設計者自身が静的参照用にハードコーディングされた文字列とともにCreateQueryを使用し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);
}

人気のある回答

public IQueryable GetTable<T>(T entity) where T : class
{
    return context.CreateObjectSet<T>();
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ