使用Linq返回不同的值来查询数据表

时间:2012-03-27 16:36:02

标签: c# linq lambda

我试图从数据表列中获取不同的值。这是我的代码..

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作为值。我需要存储在行中的实际值而不是行类型。此代码也是在列中仅捕获不同值的正确方法吗?

3 个答案:

答案 0 :(得分:4)

我会做这样的事情:

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

请注意,可以跳过.ToList(),但当然这取决于DataSource对象的ddlSource属性能够接受的内容。如果它是一个winforms控件,我怀疑ToList是必要的。

您的代码与此代码基本相同,但您必须将最后Select更改为Select(x => x.Key)以选择用于对行进行分组的值,而不是第一行。
此外,您的代码比使用Distinct的开销更大,因为GroupBy会创建原始集合的子组。

答案 1 :(得分:0)

为什么不使用.Distinct扩展方法?

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

答案 2 :(得分:0)

怎么样

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

(您无需在字符串上调用.ToString(),因此我已将其删除。)