使用LINQ过滤DataTable的问题

时间:2016-01-07 08:52:47

标签: c# linq

我有DataTable dtsupp,如下所示:

Supplier | Code
---------+-----
supp1    | 001
supp2    | 002
supp3    | 003

我想通过调用

返回一个字符串
SELECT Code WHERE Supplier = mySupp

我的代码如下所示:

var code = from row1 in dtsupp.AsEnumerable()
           where row1.Field<string>("Supplier") == supp
           select row1.Field<string>("Code");

当我运行此代码时出现错误

  

system.data.enumerablerowcollection`1 [system.string]'

有人可以指导我做错了什么吗?我对LINQ很新。

2 个答案:

答案 0 :(得分:0)

您忘了执行查询。根据您的情况添加First()FirstOrDefault()Single()SingleOrDefault()ToList()等。这些方法将立即执行您的查询。

var code = (from row1 in dtsupp.AsEnumerable()
           where row1.Field<string>("Supplier") == supp
           select row1.Field<string>("Code")).First();

由于延迟执行,迭代器将不会执行,直到CLR调用我在第一句中写的方法或使用 ForEach 方法迭代。

在Linq中查找延迟和立即执行。 (for example look at that article)

答案 1 :(得分:0)

您的代码的问题在于它实际上正在返回System.Data.EnumerableRowCollection<string>,并且您可能正在直接尝试将其读作string,从而导致错误。

只需添加FirstOrDefault即可获得第一个匹配值: -

var supp = (from row1 in dtsupp.AsEnumerable()
           where row1.Field<string>("Supplier") == supp
           select row1.Field<string>("Code")).FirstOrDefault();

或者如果可能有多个Supplier具有相同的Code,那么让查询保持原样并使用foreach循环(实际运行查询)进行迭代,如下所示: - < / p>

 foreach (var item in supp)
 {
     Console.WriteLine(item);
 }