2009-07-27 11 views
8

Busco un equivalente de la DataContext.GetTable<TEntity> en Entity Framework. He encontrado el método ObjectContext.CreateQuery<T> pero es diferente de DataContext.GetTable<TEntity> ya que necesita una cadena de consulta para funcionar.¿Tiene el marco de la entidad tiene un equivalente de DataContext.GetTable <TEntity> de Linq2Sql (ObjectContext.CreateQuery <T>?)

¿Hay alguna forma de obtener un objeto IQueryable para una tabla utilizando el tipo de entidad sin especificar la cadena de consulta?

*EDIT: Added code snippet*
Este es un fragmento de una clase repositorio he aplicado que trabaja con linq2sql. No puedo usar ObjectContext.[TableName] porque ya no sería genérico.

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..)*
Esto es lo que estoy usando:

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

Esto funciona siempre y cuando el nombre de la clase es el mismo del nombre de la tabla. Esto se convertirá en un problema para mí cuando empiece a usar diferentes objetos para la misma tabla.

espero haber sido claro, gracias de antemano,
Marco :)

+0

Marco B, ¿ha encontrado una solución? Tengo el mismo problema e incluso pasar "[EntitySet]" como parámetro a CreateQuery no puedo hacer que funcione. –

+2

Encontré esta respuesta primero, y [esta respuesta] (http://stackoverflow.com/questions/7263083/gettable-equivalent-for-objectcontext) después de eso. Parece que la segunda respuesta tiene una forma mucho más fácil de hacer esto que se asemeja a 'GetTable' de Linq2SQL –

Respuesta

6

En realidad, el propio diseñador de EF usa CreateQuery con cadenas codificadas para las referencias estáticas. Si se mira en el archivo del diseñador verá algo como esto:

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; 

Técnicamente no hay una solución perfecta porque se puede utilizar el mismo tipo de entidad para diferentes conjuntos de entidades. Sin embargo, se puede dar el viejo intento de la universidad:

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

¡Gracias, funciona bien! Por casualidad hoy encontré una solución similar en el proyecto kigg en codeplex (http://kigg.codeplex.com). – marcob

+0

Intentando usar este código, pero el problema es que BaseEntitySets.First no es IQueryable, por lo que no veo cómo otros consiguieron que este ejemplo funcione. –

+0

Creo que esta pregunta necesita una actualización. Parece que la persona que hizo la pregunta aceptó una respuesta de la que solo está usando parte, por lo que la respuesta es confusa.En realidad, el Interlocutor solo está usando el código 'return context.CreateQuery (t.Name);' que no noté y pasé un par de horas intentando que la Respuesta aceptada funcionara. Tan pronto como cambié a usar el método CreateQuery SOLAMENTE, funciona perfectamente. –

0

espero que no me falta el punto, pero ¿no sería:

ObjectContext.TableName 

Dónde TableName es EntitySet del tipo con el que desea trabajar.

+0

Hola, no quiero usar el nombre de la tabla porque quiero tener una forma genérica de acceder a la tabla. Agregué un fragmento de código de mi clase para explicar mejor lo que me gustaría lograr. La única solución que me puedo imaginar ahora es usar el método ObjectContext.CreateQuery cambiando un poco la estructura de mi clase genérica pasando al constructor también el TableName. – marcob

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