2012-04-25 19 views
6

Jak mogę filtrować dane z zestawu danych do datatable? jak Code>Uzyskiwanie przefiltrowanych danych z zestawu danych do datatable

DataRow[] dr = DS.Tables[0] 
    .Select("STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL");   

Jak mogę użyć tutaj DataTable?

następujący kod doesn `odzwierciedlać changes->

DataTable FilteredDataD = DS.Tables[0]; 
if (FilteredDataD.Rows.Count > 0) { 
    FilteredDataD.DefaultView.RowFilter = "STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL"; 
    FilteredDataD.DefaultView.ToTable(); 
} 

Czy jest możliwe, aby usunąć kolumnę przy użyciu powyżej filtra, jak "pseudonim artystyczny = 'Develop' I DEVLAPSEDAYS IS NOT NULL" + FilteredDataD.column (” col_name ") ... Załóżmy, że mam tylko 5 kolumn wyświetlających 4, nie mogę usunąć col_name z mojego zapytania. Czy jest jakiś sposób?

Odpowiedz

Odpowiedz

11

Spróbuj użyć LINQ zamiast:

var table = DS.Tables[0].AsEnumerable().Where(
    r => r.Field<string>("STAGENAME") == "Develop" && r.Field<int?>("DEVLAPSEDAYS").HasValue).AsDataView().ToTable(); 

EDIT Zmieniono AsDataView do AsDataView() dla składniowej dokładnością.
EDIT Pod .NET 2.0 rozwiązanie zgodne

DataTable table = DS.Tables[0]; 
if (table.Rows.Count > 0) 
{ 
    table.DefaultView.RowFilter = "STAGENAME = 'DEVELOP' AND DEVLAPSEDAYS IS NOT NULL"; 
    table = table.DefaultView.ToTable(); 
} 
+0

James, AsEnumerable() nie może znaleźć w moim VS, używam wersji .net 2.0.Reply – palak

+0

@JamesJohnson +1, nie mam pojęcia o "widokach" używanych w zestawach danych i tym podobnych. To dobre rozwiązanie. – Matt

+0

@JamesJohnson: Hi james dziękuje za odpowiedź, ale to nie działa, filtrowanie się nie dzieje. – palak

6

można napisać metodę rozszerzenia (przy użyciu C# 3), jak następuje:

public static DataTable Filter(this DataTable dataTable, string selectFilter) 
{ 
    var filteredTable = dataTable.Clone(); 
    var rows = dataTable.Select(selectFilter).ToList(); 
    rows.ForEach(filteredTable.ImportRow); 
    return filteredTable; 
} 

następnie używać go jak następuje:

DataTable dataTable = DS.Tables[0] 
    .Filter("STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL"); 

Aktualizacja, od kiedy powiedziałeś, że używasz C# 2.0 (a więc metody rozszerzania i LINQ aren „T opcja) można użyć zamiast tego:

public static DataTable GetFilteredTable(
    DataTable sourceTable, string selectFilter) 
{ 
    var filteredTable = sourceTable.Clone(); 
    var rows = sourceTable.Select(selectFilter); 
    foreach (DataRow row in rows) 
    { 
     filteredTable.ImportRow(row); 
    } 
    return filteredTable; 
} 

DataTable dataTable = GetFilteredTable(
    DS.Tables[0], "STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL"); 
+0

Matt, Dzięki za odpowiedź, jestem nie znalezienie odniesienia dla ToList(), jestem przy użyciu C# 2.0 .. – palak

+0

@palak, aktualizowane moją odpowiedź . – Matt

+0

@Matt: Twoja pierwsza odpowiedź to okrężny sposób robienia tego, co robi 'DataTable.DefaultView.RowFilter'. –

Powiązane problemy