2012-03-27 62 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