如果不进行强制转换,我无法查询
DataView
。 IsPresent 方法中的两行代码取自 "LINQ - 指定的强制转换对于数据视图使用无效",并且似乎对每个人都有效,除了一位评论者。我正在“使用”LINQ 命名空间,那么我的问题是什么?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// works
DataView o = new DataView();
var p = from x in o.Cast<DataRowView>() where x.Row.Field<bool>("xxx") select x.Row;
}
public static bool IsPresent(DataView dvDataTag, string colName)
{
// does not work
int count = dvDataTag.Count(drv => string.Equals("1", drv[colName].ToString()));
return dvDataTag.Any(drv => string.Equals("1", drv[colName].ToString()));
}
}
}
错误 2“System.Data.DataView”不包含“Any”的定义,并且找不到接受“System.Data.DataView”类型的第一个参数的扩展方法“Any”(您是否缺少 using 指令或程序集引用?) A:\TEMP\ConsoleApplication1\ConsoleApplication1\Program.cs ConsoleApplication1 20 20
尝试像在 Main 方法中那样转换表格:
int count = dvDataTag.OfType<DataRowView>().Count(drv => string.Equals("1", drv[colName].ToString()));
return dvDataTag.OfType<DataRowView>().Any(drv => string.Equals("1", drv[colName].ToString()));
我也尝试了
.Cast<DataRowView>()
就像你的 Main 方法一样,并且也编译了。
这是因为
DataView
实现了非泛型 IEnumerable
(LINQ 可以与 IEnumerable 一起使用吗?)。最重要的是,这有点令人困惑,因为 DataView
枚举器返回 DataRowView
类型的对象。
使用
.Cast<DataRowView>()
Linq 方法,因为您知道它们都是这种类型。从技术上讲,您可以使用 .OfType<DataRowView>()
,但请注意,它会默默地忽略集合中不属于该类型的任何对象,而 Cast
将抛出异常(https://stackoverflow.com/a /4015967/530545).