2009-12-10 22 views
24

datatable içinde belirli bir satırdaki belirli bir sütundaki değeri seçmek için LINQ (C#)'u nasıl kullanırsınız. eşdeğer SQL olacaktır: peşinLinq: bir datatable sütunundaki değeri seçin

select NAME from TABLE where ID = 0 

teşekkürler. Satır benzersiz ise

cevap

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

o zaman bile sadece yapabileceği:

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

Bir SingleOrDefault çağrısını çağırmanın aslında tam anlamıyla SQL'e çevrildiğinde tüm sütunları seçeceğine dikkat edin (IQueryable yerine bir MyTable nesnesi döndürdüğü için). Tabloda, seçili yöntemin yapamayacağı performans etkisine sahip olabilecek başkalarına bağlı olarak. Tipik bir tabloda okunabilirlik, küçük bir performans farkına değecektir fakat soru eşdeğer SQL ile ilgili olduğundan, açıklamaya değdiğini düşündüm. – fyjham

+0

SingleOrDefault, bir kümeden benzersiz bir öğe almak istediğinizde en uygun şekilde kullanılır. Hangi sesler ile OP'dir. – James

+0

Bu, SingleOrDefault gibi çalıştı. Teşekkürler – ianbeks

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

satırlara bilen bir DataTable, bilge diğer satırının yer kullanmanız gerekir var düşünürsek endeksi:

where row[rowNumber] == 0 
ayrıca anonim sınıfa satır veri yerleştirmek için seçme kullanmak isterdim Bu durumda

veya önceden hazırlanmış clas ler Diğerleri yüzden sadece ben lambda sözdizimi eşdeğer koyacağım bu tam olması dışı lambda sözdizimi verdik fark

7

(başka bir yönteme geçmek istiyorsanız): (

Olmayan lamda) James'in gönderim başına gibidir:

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

Eşdeğer lambda sözdizimi: gerçekten çok pratik bir fark hangisini tercih ettiğinizi sadece kişisel görüş bile yok

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

.

+0

Bence lambda cevabınız işaretli olandan daha doğru. SingleOrDefault(), satırın tüm sütunlarını getirecektir (OP'nin istediği bu değil, OP yalnızca bir sütun için talep edilir). Where() ve Select() birleşimi, gerekli sütunu yalnızca tüm sütunları getirmekten daha fazla getirecektir. Yanlış olursam beni düzelt. – gsk

+0

Evet, haklısın. Sonunda ".SingleOrDefault()" ifadesini hala yapabilirsiniz (örneğin: string name = DataContext.MyTable.Where (i => i.ID == 0) .Select (i => i.Name) .SingleOrDefault(); 'sadece 1 sütunu tekrar sorgulayacaktır. SingleOrDefault hakkında doğal olarak "getirme" hiçbir şey yoktur, sadece bunun için sorguları zincirlemeniz gerekir. Bunu söyledikten sonra, diğer sütunlarda çok büyük verileriniz olmadıkça, performans yükü genellikle ihmal edilebilir. – fyjham

23

Yanıtlarınız için teşekkürler. "MyTable" nesnesinin ne tür bir yanıtı olduğunu anlamadım (yanıtlarınızda) ve aşağıdaki kod bana aşağıda gösterilen hatayı verdi.

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

kaynak türü 'System.Data.DataTable' için sorgu modelinin bir uygulamasını bulunamadı. 'Nerede'

bulunamadı Yani benim googling devam etti ve nasıl çalışır şey bulduk:

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>(); 

Ne düşünüyorsunuz?

+0

Eğer '.AsEnumerable' kullanmak istiyorsanız dll 'System.Data.DataSetExtensions' ve bunun için bir kullanma deyimi eklediğinizden emin olun! – KennyZ

+0

YUKARIDAKİ GELİŞMİŞ YORUM: '.AsEnumerable' kullanmak istiyorsanız, dll 'System.Data.DataSetExtensions' eklediğinizden emin olun! Bunun için bir kullanma ifadesini annenize KULLANMAYIN! Sadece System.Data kullanarak ve .dll için bir başvuru olması, bunu çalışması için alır. – KennyZ

+1

'AsEnumerable', sorgunuzun bağlamını değiştirecek, yani' select/select '' inizin DB tarafında değil, bellekte gerçekleştirileceğini unutmayın. – James

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

Kullanım linq Enumerable olarak veri tablosunu ayarlamak ve aradığınızı maçları veri tablosu alanından alanları seçin ve.

Örnek Ben para yerel para birimi olan para tablosundan para Kimliği ve döviz Adı ​​almak ve formda bir metin kutularına para kimliğini ve adını atamak istediğiniz

:

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

dönüş değeri dize ve kullanabileceğiniz size Id göre arama gerekirse:

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

veya ge kullanarak nerik değişkeni:

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

Ayrıca kullanabilirsiniz: dize adı = datatable.AsEnumerable(). (Satır => Convert.ToInt32 (satır ["Id"]) == Kimlik) .Seçini (satır => satır.Field ("name")).İlk(); – mbadeveloper