我无法在不进行投射的情况下查询DataView
。方法IsPresent中的两行代码取自“LINQ - Specified cast is not valid with dataview use”,似乎适用于所有人,除了一位评论者。我正在“使用”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'的定义,也没有扩展方法'Any'接受类型为'System.Data.DataView'的第一个参数'(你是否错过了使用指令或程序集引用?)A:\ TEMP \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs ConsoleApplication1 20 20
答案 0 :(得分:2)
尝试像在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()));
我也在你的Main方法中尝试.Cast<DataRowView>()
,并且还编译了。
答案 1 :(得分:0)
这是因为DataView
实现了非通用的IEnumerable
(Does LINQ work with IEnumerable?)。最重要的是,这仅仅是因为DataView
枚举器返回类型为DataRowView
的对象而引起的混乱。
使用.Cast<DataRowView>()
Linq方法,因为您知道它们都是该类型。从技术上讲,您可以使用.OfType<DataRowView>()
,但是要注意,它将默默地忽略集合中所有非该类型的对象,而Cast
将引发异常(https://stackoverflow.com/a/4015967/530545)