2011-10-21 12 views
9

sto cercando modo per ottenere qualcosa di simile:Entity Framework fornisce i nomi delle colonne come variabile di tipo stringa

string _col1 = "first name"; 
string _name; 
var query = from c in ctx.Customers select c; 
_name = query.FirstOrDefault().[_name]; 

Per quanto posso vedere posso solo fortemente tipizzato nomi dei campi, ma vorrei fornire li come variabili stringa.

+1

intendi selezionando la colonna o il filtraggio da quella colonna? Nel tuo esempio non stai usando _col1 dopo averlo assegnato. Si prega di specificare ... – AJC

+0

Devo mettere il nome della colonna in base al valore di stringa dall'elenco di stringhe quindi non è per il filtraggio – Andy

risposta

19

Non sono sicuro che EF offra un modo per ottenere un valore di una proprietà in base al nome della stringa della proprietà, ma è possibile utilizzare la reflection.

string name = typeof(Customer) 
    .GetProperty("first name") 
    .GetValue(query.First(), null) as string; 

sto cercando di indovinare la classe EF hai a che fare con è chiamato Customer.

+1

Funziona perfettamente, grazie a tutti voi! – Andy

+0

Felice che funzioni. Si prega di contrassegnare la risposta come la risposta corretta. Grazie. –

+0

errore quando si ottiene una raccolta di elementi anziché solo uno. – Matt

4

È necessario utilizzare la riflessione per questo. Se si sta tentando di filtrare da una colonna dynamicly selezionato, si può provare qualcosa di simile:

string propertyName 
string keyword 

ParameterExpression parameter = Expression.Parameter(typeof(YourType), "x"); 
Expression property = Expression.Property(parameter, propertyName); 
Expression target = Expression.Constant(keyword); 
Expression containsMethod = Expression.Call(property, "Contains", null, target); 
Expression<Func<YourType, bool>> lambda = 
    Expression.Lambda<Func<YourType, bool>>(containsMethod, parameter); 

var companies = repository.AsQueryable().Where(lambda); 

io quello che si sta cercando di fare è la selezione di un particolare colonna, quindi è possibile utilizzare lo stesso principio per la generazione del lamba espressione e utilizzandolo nella selezione (meno la condizione)

var companies = repository.AsQueryable().Where(whatever).Select(lambda); 
+0

c'è qualche riferimento per questo? cosa significa "x"? – Matt

+0

@Matt "x" è per l'espressione lambda, come in 'x => x.Property' potrebbe essere qualsiasi cosa. Il riferimento, ho ottenuto da una domanda che ho chiesto, http://stackoverflow.com/questions/7246715/use-reflection-to-get-lambda-expression-from-property-name. – AJC

0

Per qualche tipo di motivo non funzionerà per me.

Questo è il mio simile soluzione di lavoro:

string name = null; 

// Select the PropertyInfo of the column. 
PropertyInfo propertyInfo = query.First().GetType().GetProperty("first name"); 

if (propertyInfo != null) 
{ 
    try 
    { 
    // Select the content of the column. 
    name = pi.GetValue(query.First(), null).ToString(); 
    } 
    catch (Exception) 
    { 
    // Continue with null-string. 
    } 

}