2009-12-10 21 views

risposta

16
var name = from r in MyTable 
      where r.ID == 0 
      select r.Name; 

Se la riga è unico allora si potrebbe anche solo fare:

var row = DataContext.MyTable.SingleOrDefault(r => r.ID == 0); 
var name = row != null ? row.Name : String.Empty; 
+0

Da segnalare che chiamare un call SingleOrDefault effettivamente selezionare tutte le colonne volta tradotte letteralmente in SQL (in restituisce un oggetto MyTable piuttosto che un IQueryable). A seconda di quale altra tabella è presente nella tabella, potrebbe avere un impatto sulle prestazioni che il metodo di selezione non avrà. Su una tabella tipica la leggibilità è discutibilmente valsa la piccola differenza di prestazioni ma poiché la domanda era su SQL equivalente ho pensato che valesse la pena chiarire. – fyjham

+0

SingleOrDefault viene utilizzato in modo appropriato quando si cerca di recuperare un oggetto unico da un set. Che a quanto pare l'OP è. – James

+0

Funzionava così come SingleOrDefault. Grazie – ianbeks

0
var x = from row in table 
      where row.ID == 0 
      select row 

Supponendo di avere un DataTable che conosce le righe, l'altro saggio è necessario utilizzare la riga Indice:

where row[rowNumber] == 0 

In questo caso si sarebbe anche desidera utilizzare la selezione per inserire i dati di righe in una classe anonima o un clas preprepared s (se si desidera passare a un altro metodo)

7

ho notato altri hanno dato la sintassi non-lambda in modo solo per avere questo completo metterò nella sintassi lambda equivalente:

non lambda (come da post di James):

var name = from i in DataContext.MyTable 
      where i.ID == 0 
      select i.Name 

equivalente sintassi lambda:

var name = DataContext.MyTable.Where(i => i.ID == 0) 
           .Select(i => new { Name = i.Name }); 

non c'è davvero molta differenza pratica, proprio parere personale su cui si preferisce.

+0

Penso che la tua risposta lambda sia corretta rispetto a quella contrassegnata. SingleOrDefault() recupera tutte le colonne della riga (questo non è l'OP richiesto, OP richiesto solo per una colonna). La combinazione Where() e Select() recupera solo la colonna richiesta rispetto al recupero di tutte le colonne. Plz correggimi se sbaglio. – gsk

+0

Sì, hai ragione. È comunque possibile eseguire ".SingleOrDefault()" alla fine (ad esempio: 'string name = DataContext.MyTable.Where (i => i.ID == 0) .Select (i => i.Name) .SingleOrDefault(); 'interroga solo la colonna 1 indietro). Non c'è nulla di intrinsecamente "fetch-all" su SingleOrDefault, devi solo concatenare le query per quello. Detto questo, l'overhead delle prestazioni è generalmente trascurabile a meno che non si disponga di dati molto grandi nelle altre colonne. – fyjham

23

Grazie per le vostre risposte. Non ho capito quale tipo di oggetto "MyTable" era (nelle tue risposte) e il codice seguente mi ha dato l'errore mostrato di seguito.

DataTable dt = ds.Tables[0]; 
var name = from r in dt 
      where r.ID == 0 
      select r.Name; 

Impossibile trovare un'implementazione del modello di query per il tipo di fonte 'System.Data.DataTable'. 'Dove' non trovato

Così ho continuato il mio googling e trovato qualcosa che funziona:

var rowColl = ds.Tables[0].AsEnumerable(); 
string name = (from r in rowColl 
       where r.Field<int>("ID") == 0 
       select r.Field<string>("NAME")).First<string>(); 

Cosa ne pensi?

+0

Se si desidera utilizzare '.AsEnumerable', assicurarsi di aggiungere la DLL 'System.Data.DataSetExtensions' e un'istruzione using per questo! – KennyZ

+0

COMMENTO REVISIONATO SOPRA: Se si desidera utilizzare ".AsEnumerable", assicurarsi di aggiungere la DLL "System.Data.DataSetExtensions"! NON ann un using dichiarazione per esso! Usare semplicemente System.Data e avere un riferimento per il file .dll farà in modo che funzioni. – KennyZ

+1

Si noti che 'AsEnumerable' cambierà il contesto della query in modo che il' where/select' sarà eseguito in memoria e non sul lato DB. – James

0
var name = from DataRow dr in tblClassCode.Rows where (long)dr["ID"] == Convert.ToInt32(i) select (int)dr["Name"]).FirstOrDefault().ToString() 
0

utilizzare LINQ e impostare la tabella di dati come Enumerable e selezionare i campi dal campo tabella di dati che corrisponde a quello che stai cercando.

Esempio

voglio ottenere la valuta Id e la valuta nome dal tavolo di valuta in cui valuta è la valuta locale e assegnare l'ID di valuta e il nome di un box di testo nel modulo:

DataTable dt = curData.loadCurrency(); 
      var curId = from c in dt.AsEnumerable() 
         where c.Field<bool>("LocalCurrency") == true 
         select c.Field<int>("CURID"); 

      foreach (int cid in curId) 
      { 
       txtCURID.Text = cid.ToString(); 
      } 
      var curName = from c in dt.AsEnumerable() 
          where c.Field<bool>("LocalCurrency") == true 
          select c.Field<string>("CurName"); 
      foreach (string cName in curName) 
      { 
       txtCurrency.Text = cName.ToString(); 
      } 
1

Se il valore di ritorno è di stringa e avete bisogno di ricerca per ID è possibile utilizzare:

string name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name")).ToString(); 

o utilizzando ge variabile Neric:

var name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name")); 
+1

È inoltre possibile utilizzare: string name = datatable.AsEnumerable(). Where (row => Convert.ToInt32 (row ["Id"]) == Id) .Select (row => row.Field ("nome"))).Primo(); – mbadeveloper

Problemi correlati