2009-07-27 4 views
8

Sto cercando un equivalente della DataContext.GetTable<TEntity> in Entity Framework. Ho trovato il metodo ObjectContext.CreateQuery<T> ma è diverso da DataContext.GetTable<TEntity> poiché ha bisogno di una querystring per funzionare.Fa Entity Framework ha un equivalente di DataContext.GetTable <TEntity> da Linq2Sql (ObjectContext.CreateQuery <T>?)

C'è un modo per ottenere un oggetto IQueryable per una tabella utilizzando il tipo di entità senza specificare la stringa di query?

*EDIT: Added code snippet*
Questo è uno snippet di una classe di repository che ho implementato che funziona con linq2sql. Non posso usare ObjectContext.[TableName] perché non sarebbe più generico.

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..)*
questo è quello che sto usando:

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

Questo funziona fino a quando il nome della classe è lo stesso del nome della tabella. Questo diventerà un problema per me quando inizierò a utilizzare oggetti diversi per lo stesso tavolo.

Spero di essere stato chiaro, grazie in anticipo,
Marco :)

+0

Marco B, hai trovato una soluzione? Ho lo stesso problema e anche passando "[EntitySet]" come parametro per CreateQuery, non riesco a farlo funzionare. –

+2

Ho trovato prima questa risposta e [questa risposta] (http://stackoverflow.com/questions/7263083/gettable-equivalent-for-objectcontext) dopo. Sembra che la seconda risposta abbia un modo molto più semplice di fare ciò che assomiglia a 'GetTable' da Linq2SQL –

risposta

6

In realtà, lo stesso progettista EF utilizza CreateQuery con stringhe hard-coded per i riferimenti statici. Se si scava nel file progettista vedrete qualcosa di simile:

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; 

Tecnicamente non c'è soluzione perfetta, perché si può usare lo stesso tipo di entità per i diversi insiemi di entità. Ma si può dare il vecchio collegio provare:

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

Grazie funziona! Per caso oggi ho trovato una soluzione simile nel progetto kigg su codeplex (http://kigg.codeplex.com). – marcob

+0

Cercando di usare questo codice, ma il problema è che BaseEntitySets.First non è IQueryable, quindi non vedo come altri hanno funzionato questo esempio. –

+0

Penso che questa domanda debba essere aggiornata. Sembra che la persona che ha fatto la domanda abbia accettato una risposta che sta solo utilizzando una parte, quindi la risposta è confusa.In realtà l'Interrogatore utilizza solo il 'return context.CreateQuery (t.Name);' codice che non ho notato e ha impiegato un paio d'ore a cercare di far funzionare la risposta accettata. Non appena sono passato a utilizzare il metodo CreateQuery SOLO, funziona perfettamente. –

0

spero non mi manca il punto, ma non sarebbe:

ObjectContext.TableName 

Dove TableName è EntitySet del tipo con cui si desidera lavorare.

+0

Ciao, non voglio usare il nome della tabella perché voglio avere un modo generico di accedere alla tabella. Ho aggiunto uno snippet di codice dalla mia classe per spiegare meglio cosa mi piacerebbe ottenere. L'unica soluzione che posso immaginare adesso è usare il metodo ObjectContext.CreateQuery cambiando un po 'la struttura della mia classe generica passando al costruttore anche il TableName. – marcob

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