2013-07-25 11 views
5

Ho un DbSet<T>accedere a una proprietà di un DbSet per nome

voglio accedere una delle proprietà su di essa per nome.

È possibile?

Fondamentalmente sto facendo una funzione generica, così che per ogni DbSet che ho, posso specificare una colonna e farla elencare i valori di quella colonna.

È possibile ottenere lo stesso DbSet dal contesto facendo context.Set(T) ma non sono sicuro dei campi.

+0

Qual è il contesto generica qui? Puoi mostrare la firma del metodo in cui vuoi che la tua query abbia origine (per vedere quale tipo di parametro di tipo generico abbiamo) e magari un'istruzione a riga singola che usa quel metodo e il risultato atteso? –

+0

Il concetto è che ho una tabella chiamata "libri" e uno dei campi è "autore" e voglio eseguire una ricerca sulla colonna "autore". Ho anche molte altre tabelle su cui voglio eseguire la ricerca identica, quindi creare un metodo generico dove dico darmi degli oggetti corrispondenti, ad es. 'IEnumerable ' facendo corrispondere la colonna '" Autore "' o qualunque colonna specifichi. – NibblyPig

risposta

7

Ho fatto qualcosa di simile un po 'indietro usando il riflesso.

T item = context.Set(T).First(); 
string propName = "MyProperty"; 
object value = item.GetType().GetProperty(propName).GetValue(item, null); 

Naturalmente nota che si sia bisogno di gettare i valori per un tipo specifico manualmente, o utilizzare ToString, che dovrebbe funzionare abbastanza bene su tutti i tipi di base.

Si presume che si disponga già dei dati dal server e che ora sia necessario elaborarli.

EDIT:

Se si desidera creare una query, poi ho trovato this!

Apparentemente, quello che stai cercando è disponibile negli esempi forniti con Visual Studio (o puoi scaricarli separatamente).

È disponibile un metodo di estensione che consente di utilizzare .Select("propertyName") che restituisce IQueriable. Ricorda di aggiungere using System.Linq.Dynamic; (e, naturalmente, aggiungi il file .cs richiesto al tuo progetto).

È quindi possibile creare query selezionate specificando il nome del parametro.

List<object> data = (db.Set<SetType>() 
         .Where("propertyName == @0 && someOtherProperty == @1", propertyValue, someOtherPropertyValue) 
         .Select("propertyName") as IEnumerable<object>).ToList(); 
+0

Cool, ho appena provato questo, quali pensi che saranno le implicazioni sulla performance? Presumo che genererà semplicemente una singola istruzione SQL, quindi se volessi selezionare tutte le entità con un campo "Nome" di "Ciao", allora potrei semplicemente fare dbSet.Where (c => c.GetType ..... GetValue. .. == "Ciao") e il problema delle prestazioni sarebbe trascurabile? – NibblyPig

+0

@SLC Ho trovato una soluzione al tuo problema - controlla la risposta aggiornata! :) – Shaamaan

+0

Esatto, ho provato il primo bit che sembrava funzionasse, ma LINQ to Entities prova a tradurre l'intera GetType GetProperty e fallisce.Immagino perché quella parte deve essere fatta lato server e solo il risultato dovrebbe andare in LINQ alle entità? 'dbSet.Where (c => c.GetType(). GetProperty (propertyName) .GetValue (c, null) == someString)' – NibblyPig

4

Check out this article on Dynamic LINQ.

Utilizzando il codice fornito, sono stato in grado di scrivere un LINQ to Entities query come questa:

var query = context.Set(Type.GetType("Person")).Select("Name"); 
Problemi correlati