我有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很新。
答案 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);
}