关于DataView的LINQ

时间:2012-02-01 03:46:48

标签: linq ado.net dataview

我无法在不进行投射的情况下查询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

2 个答案:

答案 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实现了非通用的IEnumerableDoes LINQ work with IEnumerable?)。最重要的是,这仅仅是因为DataView枚举器返回类型为DataRowView的对象而引起的混乱。

使用.Cast<DataRowView>() Linq方法,因为您知道它们都是该类型。从技术上讲,您可以使用.OfType<DataRowView>(),但是要注意,它将默默地忽略集合中所有非该类型的对象,而Cast将引发异常(https://stackoverflow.com/a/4015967/530545