2012-03-27 39 views
1

我試圖從數據表列中獲取不同的值。這裏是我的代碼..使用Linq查詢Datable返回不同​​的值

var sourceItems = ds.Tables[0].AsEnumerable() 
           .GroupBy(x => x.Field<string>("Source").ToString()) 
           .Select(x => x.First()); 
ddlSource.DataSource = sourceItems; 
ddlSource.DataBind(); 

此代碼返回4行System.Data.DataRow的值。我需要存儲在行中的實際值而不是行類型。此代碼是否僅適用於只抓取列中的不同值?

回答

4

我會做這樣的事情:

var sourceItems = ds.Tables[0].AsEnumerable() 
           .Select(x => x.Field<string>("Source")) 
           .Distinct() 
           .ToList(); 

注意.ToList()可以跳過,當然這取決於什麼ddlSource對象的DataSource屬性是能夠接受的。如果這是一個winforms控件,我懷疑ToList是必要的。

您的代碼基本上與此相同,但您必須將最後的Select更改爲Select(x => x.Key)以選擇用於對行進行分組的值,而不是第一行。
此外,由於GroupBy會創建原始集合的子組,因此您的代碼比使用Distinct開銷更多。

+0

新增關於你的代碼的解釋。 – digEmAll 2012-03-27 17:13:39

+0

Shabam!謝謝! – cgatian 2012-12-13 18:14:52

0

爲什麼不使用.Distinct擴展方法?

ds.Tables[0].AsEnumerable() 
    .Select(x => x.Field<string>("Source").ToString()) 
    .Distinct() 
    .FirstOrDefault(); 
0

如何

var sourceItems = ds.Tables[0].AsEnumerable() 
         .Select(x => x.Field<string>("Source")) 
         .Distinct() 
         .ToList(); 
    ddlSource.DataSource = sourceItems; 
    ddlSource.DataBind(); 

(你並不需要調用.ToString()一個字符串,所以我已刪除。)

+0

這工作正常,但是當我在下拉菜單中顯示它時,出於某種原因,每行顯示1個字符。在將其設置爲數據源之前,我是否必須將sourceItems轉換爲List或datable? – 2012-03-27 16:47:56

+0

@NickLaMarca有幾種可能性。可能調用.ToList()將解決問題。我已經編輯了相應的代碼。 – phoog 2012-03-27 16:58:56