LINQ Seleziona dalla stringa tableName dynamic

Voglio ottenere l’elenco dei record da un modello di quadro (sto usando EF versione 5) con un accountID particolare. Mi viene fornita la stringa tableName (che deve essere dynamic) e l’ID account. Sto provando i seguenti 2 metodi, ma nessuno di essi funziona (dandomi errori sulla tabella “IQueryable” dell’object:


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  recList = ( from records in table where records.AccountID == accID select records).ToList(); 

La var query = table.Where(....).Select(...) è lo spostamento corretto, e ciò consente di riflettere come query builder in runtime.

Tuttavia, t.AccountID è un errore a causa del tipo di t rimane sconosciuto.

Ho fatto molti anni fa simili usando System.Linq.Expressions.Expression direttamente in Linq2Sql.

per esempio

 // 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(); 

Ricordo che dovrebbe essere più semplice la syntax, se l’object ha un’interfaccia comune

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

Oppure, se hai solo un tavolo da sostenere.

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

Ho creato un DynamicRepository per un progetto su cui sto lavorando. Usa metodi generici esposti tramite EF insieme a linq dinamico. Potrebbe essere utile guardare il codice sorgente qui:

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

È ansible eseguire una query sull’area di lavoro dei metadati della struttura dell’ quadro per ottenere il tipo per un determinato nome di tabella. Questo link potrebbe aiutare: ottenere tabelle e relazioni