2009-07-27 1 views
8

Ich bin auf der Suche nach einem Äquivalent der DataContext.GetTable<TEntity> in Entity Framework. Ich habe die ObjectContext.CreateQuery<T> Methode gefunden, aber es unterscheidet sich von DataContext.GetTable<TEntity>, da es eine Querystring benötigt, um zu arbeiten.Hat das Entity Framework ein Äquivalent von DataContext.GetTable <TEntity> von Linq2Sql (ObjectContext.CreateQuery <T>?)

Gibt es eine Möglichkeit, ein IQueryable-Objekt für eine Tabelle mit dem Entitätstyp ohne Angabe der Querystring zu erhalten?

*EDIT: Added code snippet*
Dies ist ein Ausschnitt einer Repository-Klasse, die ich implementiert habe, die mit linq2sql funktioniert. Ich kann ObjectContext.[TableName] nicht verwenden, weil 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..)*
Dies ist, was ich verwende:

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

Das funktioniert, solange der Klassenname mit dem der Tabellenname ist. Dies wird ein Problem für mich, wenn ich anfangen werde, verschiedene Objekte für die gleiche Tabelle zu verwenden.

Ich hoffe, ich habe klar gewesen, danke im voraus,
Marco :)

+0

Marco B haben Sie eine Lösung gefunden? Ich habe das gleiche Problem und übergebe sogar "[EntitySet]" als Parameter an CreateQuery Ich kann es nicht funktionieren. –

+2

Ich fand diese Antwort zuerst und [diese Antwort] (http://StackOverflow.com/questions/7263083/gettable-equivalent-for- objectcontext) danach. Es scheint, dass die zweite Antwort eine viel einfachere Möglichkeit hat, dies zu tun, die GetTable von Linq2SQL –

Antwort

6

Tatsächlich verwendet der EF-Designer selbst CreateQuery mit fest codierten Strings für die statischen Referenzen. Wenn Sie in die Designer-Datei graben werden Sie etwas sehen:

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, weil Sie den gleichen Entitätstyp für verschiedene Entitätsmengen verwenden können. Aber man kann es das alte 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); 
} 
+0

Danke, es funktioniert gut! Durch Zufall fand ich heute eine ähnliche Lösung im Kigg-Projekt auf Codeplex (http://kigg.codeplex.com). – marcob

+0

Ich versuche, diesen Code zu verwenden, aber das Problem ist, dass BaseEntitySets.First nicht IQueryable ist, also sehe ich nicht, wie andere dieses Beispiel funktionierten. –

+0

Ich denke, diese Frage muss aktualisiert werden. Es scheint, dass die Person, die die Frage gestellt hat, eine Antwort angenommen hat, von der sie nur einen Teil benutzt, also ist die Antwort verwirrend.In Wirklichkeit benutzt der Fragende nur den 'report context.CreateQuery (t.Name);' Code, den ich nicht bemerkt habe und der ein paar Stunden damit verbracht hat, die akzeptierte Antwort zu erhalten. Sobald ich auf die CreateQuery-Methode umgestellt habe, funktioniert es perfekt. –

0

Ich hoffe, ich bin nicht der Punkt fehlt, aber wäre es nicht:

ObjectContext.TableName 

Wo TableName ist das EntitySet des Typs, mit dem Sie arbeiten möchten.

+0

ähnelt. Hallo, ich möchte nicht den Tabellennamen verwenden, weil ich eine generische Art des Zugriffs auf die Tabelle haben möchte. Ich habe ein Code-Snippet aus meiner Klasse hinzugefügt, um besser zu erklären, was ich erreichen möchte. Die einzige Lösung, die ich mir vorstellen kann, ist die Verwendung der ObjectContext.CreateQuery Methode, die ein wenig die Struktur meiner generischen Klasse ändert, die auch den TableName an den Konstruktor übergibt. – marcob

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