Hat das Entity Framework ein Äquivalent zu DataContext.GetTable? von Linq2Sql (ObjectContext.CreateQuery ?)

.net c# entity-framework

Frage

Ich bin auf der Suche nach einer Entsprechung von DataContext.GetTable<TEntity> in Entity Framework. Ich habe die ObjectContext.CreateQuery<T> -Methode gefunden, unterscheidet sich jedoch von DataContext.GetTable<TEntity> da eine Querystring-Funktion erforderlich ist.

Gibt es eine Möglichkeit, ein IQueryable-Objekt für eine Tabelle mit dem Entitätstyp abzurufen, ohne den Abfragestring anzugeben?

*EDIT: Added code snippet*
Dies ist ein Ausschnitt aus einer von mir implementierten Repository-Klasse, die mit linq2sql funktioniert. Ich kann ObjectContext.[TableName] nicht verwenden, da es nicht mehr generisch wäre.

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..)*
Das verwende ich:

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

Dies funktioniert solange der Klassenname mit dem Tabellennamen übereinstimmt. Dies wird zu einem Problem für mich, wenn ich verschiedene Objekte für dieselbe Tabelle verwenden möchte.

Ich hoffe, ich war im Voraus dankbar.
Marco :)

Akzeptierte Antwort

Tatsächlich verwendet der EF-Designer CreateQuery selbst mit CreateQuery Zeichenfolgen für die statischen Referenzen. Wenn Sie in die Designer-Datei graben, sehen Sie Folgendes:

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;

Technisch gibt es keine perfekte Lösung, da Sie denselben Entitätstyp für verschiedene Entitätssätze verwenden können. Aber du kannst es beim alten College versuchen:

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);
}

Beliebte Antwort

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum