2010-08-11 6 views
10

Come posso cercare le righe in un DataTable per una riga con Col1 = "MyValue"Come utilizzare le espressioni lambda per filtrare i DataRows?

Sto pensando qualcosa di simile

Assert.IsTrue(dataSet.Tables[0].Rows. 
    FindAll(x => x.Col1 == "MyValue").Count == 1); 

Ma, naturalmente, che non funziona!

+0

Vuoi tornare le righe corrispondenti, o semplicemente ottenere un conteggio di quanti ci sono? –

risposta

23

È possibile utilizzare LINQ to DataSets per fare questo:

Assert.IsTrue(dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Count() == 1); 

nota, è anche possibile fare questo senza la chiamata di affermare:

dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Single(); 

Se il numero di righe non è uguale uno (quindi, la chiamata a "Single"), quindi verrà generata un'eccezione e quell'eccezione non gestita dovrebbe fallire il test case. Personalmente, mi piace quest'ultimo, in quanto ha un significato semantico più chiaro.

È possibile che questo può essere ulteriormente ridotto a:

dataSet.Tables[0].AsEnumerable().Single(
    r => ((string) r["Col1"]) == "MyValue"); 

Inoltre, è possibile sfruttare la Field method sul DataRowExtensions class per semplificare l'accesso type-safe per il campo (oltre a fornire il vantaggio supplementare di conversione DBNull su null controparti in .NET):

dataSet.Tables[0].AsEnumerable().Single(
    r => r.Field<string>("Col1") == "MyValue"); 
0

Il codice che hai scritto controlla che ci sia solo una riga che soddisfa la tua condizione di ricerca. Se si vuole realmente le righe, cadere il Assert e Count

1

Perché usare lambda e non select?

DataRow[] foundRow = (dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'"); 
+0

Dovrebbe essere solo 1 segno uguale – JWiley

2

È possibile utilizzare il metodo della tabella di dati Select per fare questo, oppure il filtro di proprietà della DefaultDataView su la tavola.

Per il metodo Select:

var rows = dataSet.Tables[0].Select("Col1 = 'MyValue'"); 

Per la DefaultView Filter:

dataSet.Tables[0].DefaultView.Fitler = "Col1 = 'MyValue'"; 
foreach (var drv in dataSet.Tables[0].DefaultView) 
{ 
    // Do your processing 
} 
+0

Questo potrebbe non essere ciò che il richiedente stava cercando, ma l'ho trovato utile. – twip

3

Si può provare questo:

var b=datatable.AsEnumerable.where(p=> p.Field<string> 
("column_name")=="desire_value").CopyToDataTable()