實體框架是否具有DataContext.GetTable的等效項來自Linq2Sql(ObjectContext.CreateQuery ?)

.net c# entity-framework

我正在尋找實體框架中的DataContext.GetTable<TEntity>的等價物。我找到了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);    
}

只要類名與表名相同,這就可以工作。當我開始為同一個表使用不同的對象時,這將成為我的問題。

我希望我已經清楚了,先謝謝,
馬可:)

一般承認的答案

實際上,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);
}

熱門答案

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


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因