2014-09-16 2 views
1

Je souhaite obtenir la liste des enregistrements d'un modèle d'entité (j'utilise EF version 5) avec un ID de compte particulier. Je suis fourni avec la chaîne tableName (cela doit être dynamique) et le compteID. J'essaie les méthodes suivantes 2 mais aucun d'entre eux travaille (en me donnant des erreurs sur l'objet IQueryable « table »:LINQ Sélection à partir de la chaîne dynamicNameName


PropertyInfo info = _db.GetType().GetProperty(tableName); 
IQueryable table = info.GetValue(_db, null) as IQueryable; 

var query = table.Where(t => t.AccountID == accID) 
         .Select(t => t); 

List <object> recList = ( from records in table 
          where records.AccountID == accID 
          select records).ToList<object>(); 

+1

Pouvez-vous montrer ce qu'est l'erreur? – paisanco

Répondre

6

Le var query = table.Where(....).Select(...) est mouvement correct, et qui permet la réflexion comme générateur de requêtes dans l'exécution.

Cependant, t.AccountID est une erreur à cause du type de t restent inconnus.

je l'ai fait de nombreuses années aller similaire en utilisant System.Linq.Expressions.Expression directement dans Linq2Sql.

par exemple.

// NOT TESTED 
var table=context.GetTable(dynamicTableName); 
var theT=table.Experssion; // actually, I forget. DynamicExpression or MemberBinding? or 
var theField=Expression.Field(theT, "AccountID"); // or dynamic name 
var query=table.Where(Expression.Equal(theField, accID); 
var recList=query.ToList<object>(); 

Je me souviens que si une syntaxe plus facile, si vous vous opposez a une interface commune

IQueryable<MyInterface> table = context.GetTable("table") as IQueryable<MyInterface>; 
var recList=from r in table 
      where table.AccountID == ac // if your AccountID is on MyInterface 
      select table; 

Ou, si vous avez seulement quelques tables pour soutenir.

IQueryable<MyInterface> table; 
if("table1"==tableName) 
    table=_db.table1 
elseif("table2"==tableName) 
    table=_db.table2 
elseif("table3"==tableName) 
    table=_db.table3 
else 
    throw exception 
0

je construit un DynamicRepository pour un projet sur lequel je travaille. Il utilise des méthodes génériques exposées par EF avec linq dynamique. Il pourrait être utile d'examiner ce code source ici:

https://dynamicmvc.codeplex.com/SourceControl/latest#DynamicMVC/DynamicMVC/Data/DynamicRepository.cs

Vous pouvez interroger l'espace de travail de métadonnées Entity Framework pour obtenir le type pour un nom de table donné. Ce lien pourrait vous aider: Get Tables and Relationships

Questions connexes