2012-10-22 15 views
48

Kullanıcılar hakkında bilgi içeren bir DataTable kullanıyorum ve bu DataTable'da bir kullanıcı veya kullanıcı listesi aramak istiyorum. Bunu denemek butit çalışmaz :(İşte Bir Veritabanını nasıl filtreleyebilirim?

benim C# kodu:.

public DataTable GetEntriesBySearch(string username,string location,DataTable table) 
     { 
      list = null; 
      list = table; 

      string expression; 
      string sortOrder; 

      expression = "Nachname = 'test'"; 
      sortOrder = "nachname DESC"; 

      DataRow[] rows = list.Select(expression, sortOrder); 

      list = null; // for testing 
      list = new DataTable(); // for testing 

      foreach (DataRow row in rows) 
      { 
       list.ImportRow(row); 
      } 

      return list; 
     } 
+0

kod çalışıyor veya herhangi bir hata alıyor musunuz? – Karthik

+0

Tam olarak neyin işe yaramadığını açıklayabilir misiniz? Bir istisna var mı yoksa 0 sonuç (2 farklı şey) mi alıyorsunuz? – James

cevap

73

en az .NET 3.5 kullanıyorsanız, ben çok daha okunabilir ve güçlü yerine beri Linq-To-DataTable kullanmak öneririm:

DataTable tblFiltered = table.AsEnumerable() 
      .Where(row => row.Field<String>("Nachname") == username 
        && row.Field<String>("Ort") == location) 
      .OrderByDescending(row => row.Field<String>("Nachname")) 
      .CopyToDataTable(); 

Yukarıdaki kod sadece bir örnektir, aslında many more methods available.

using System.Linq; eklemek unutmayın ve AsEnumerable uzatma yöntemi için System.Data.DataSetExtensions DLL (How) için bir referans.

+2

Dikkatli olun - CopyToDataTable() veri kümelerini kopyalar. Bu bir klonlama işlemi değildir, bu nedenle orijinal tablodaki özelliklerin bazıları, örn. tablo adı –

+1

@Tim: Bu kodun performans açısından ne anlama geliyor? Bazı nesne listesinde saklamak ve linq/lambda uygulamak daha mı iyi? –

+2

@RajeshMishra: Doldurulmuş bir 'DataTable'ınız varsa onu saklayın. Aksi halde, bir boks/kutucunuz olmadığından bir 'List ' seçeneğini tercih ederim. Bir 'DataTable' herşey için' System.Object' kullanır, bu yüzden her zaman dökmeniz gerekir. Anlamlı özelliklere sahip özel bir sınıfa sahip olmanın, okunabilirlikten başka birçok avantajı da vardır. –

9

net:

list = null; // for testing 
list = new DataTable(); // for testing 

foreach (DataRow row in rows) 
{ 
    list.ImportRow(row); 
} 

kullanımı:

.CopyToDataTable() 

örnek:

(Just in case) VB.NET programlama herkes için 0
string _sqlWhere = "Nachname = 'test'"; 
string _sqlOrder = "Nachname DESC"; 

DataTable _newDataTable = yurDateTable.Select(_sqlWhere, _sqlOrder).CopyToDataTable(); 
+1

Bu sorunun neden sorulan bir cevabı olduğunu biraz daha ayrıntılı olarak açıklayabilir misiniz? –

5

Dim dv As DataView = yourDatatable.DefaultView 

dv.RowFilter ="query" ' ex: "parentid = 0" 
0

Merhaba biz bazen filtre edilmez Yöntem ToLower kullanabilirsiniz.

EmployeeId = Session["EmployeeID"].ToString(); 
var rows = dtCrewList.AsEnumerable().Where 
    (row => row.Field<string>("EmployeeId").ToLower()== EmployeeId.ToLower()); 

    if (rows.Any()) 
    { 
     tblFiltered = rows.CopyToDataTable<DataRow>(); 
    } 
İlgili konular