2009-11-23 45 views
15

我想弄清楚,如果我可以使用LINQ向我提供一些數據我有一個DataTable(名字,姓氏,QTY)的不同值。我可以得到不同的值,並填寫我的清單,但我必須運行兩個不同的LINQ查詢得到它....我相信有一個更好的辦法做到這一點:)LINQ獲取不同的值和填單子

任何建議,將不勝感激(很新的LINQ)

代碼:

public static List<StudentData> LinqDistinct(DataTable dt) 
{ 
     DataTable linqTable = dt; 

     //get the distinct values 
     var query = 
      (from names in dt.AsEnumerable() 
      select new { 
       FirstName = names.Field<string>("FirstName"), 
       LastName = names.Field<string>("LastName") 
      }).Distinct(); 


     //fill my list with the distinct values 
     List<StudentData> sList = (from sa in query.AsEnumerable() 
            select new StudentData 
               { 
                FirstName = sa.FirstName, 
                LastName = sa.LastName 
                //Qty = names.Field<int>("Qty") 

               }).ToList();            



     return sList;} 

回答

19

任何理由不能簡單地做投影的不同之後,您可能需要含混後AsEnumerable(),但是這不是什麼大不了的事。

public static List<StudentData> LinqDistinct(DataTable dt) 
{ 
    DataTable linqTable = dt; 
    return 
     (from names in dt.AsEnumerable() 
     select new { 
      FirstName = names.Field<string>("FirstName"), 
      LastName = names.Field<string>("LastName") 
     }).Distinct().Select(x => 
      new StudentData() { FirstName=x.FirstName, LastName=x.LastName}) 
      .ToList(); 
} 
+0

剛剛看到這....這是完美的!現在我不必使用IEqualityComparer !.謝謝。 – scarpacci 2009-11-24 04:44:20

1

敢肯定你可能只是這樣做......

List<StudentData> sList = (from names in dt.AsEnumerable().Distinct() // I am not sure if you even have to call AsEnumerable() 
       select new StudentData() { 
        FirstName = names.Field<string>("FirstName"), 
        LastName = names.Field<string>("LastName") 
       }).ToList(); 
+0

這可能不會飛,因爲你要求一個不同的DataRow對象列表,它可能會做參考比較,並決定你的數據已經不同。但是您確實需要DataTable上的AsEnumerable()調用(不在查詢上,在原始代碼中)。 – 2009-11-23 23:37:38

+0

以上仍然不給我,我一直在尋找...感謝您的答覆雖然:)š – scarpacci 2009-11-23 23:42:45

1

你可以使用GroupBy

public static List<StudentData> LinqDistinct(DataTable dt) 
{ 
    List<StudentData> results = dt.AsEnumerable() 
     .GroupBy(row => 
     { 
      FirstName = row.Field<string>("FirstName"), 
      LastName = row.Field<string>("LastName") 
     }) 
     .Select(group => new StudentData 
     { 
      FirstName = group.Key.FirstName, 
      LastName = group.Key.LastName, 
      Qty = group.Count() 
     }) 
     .ToList(); 

    return results; 
} 

class StudentData 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Qty { get; set; } 
} 
+0

我要把這一個一個鏡頭 – scarpacci 2009-11-23 23:43:59

5

從您的問題中可以看出,數量是否是DataTable中的值,或者是給定項目的重複次數的計數,如Ecyrb的答案中所述。但是,如果您StudentData類實現IEquatable<StudentData>或覆蓋Equals方法,這應該工作:

public static List<StudentData> LinqDistinct(DataTable dt) 
{ 
    return dt.AsEnumerable() 
      .Select(row => new StudentData 
          { 
           FirstName = row.Field<string>("FirstName"), 
           LastName = row.Field<string>("LastName"), 
           Qty = row.Field<int>("Qty") 
          }) 
      .Distinct() 
      .ToList(); 
} 

如果StudentData不支持值比較,你不能說支持添加到類,您可能需要創建一個IEqualityComparer<StudentData>的實現並將其傳遞給Distinct方法。

+0

我道歉了不同行....名字,姓氏,數量都在datatable,但我只想返回FirstName/LastName。我會給你的方法一槍。謝謝! – scarpacci 2009-11-24 00:03:58

+0

+1我認爲這是你最好的選擇... – bytebender 2009-11-24 00:23:36

+0

這工作!謝謝喬爾! – scarpacci 2009-11-24 04:39:28