DataView 上的 LINQ

问题描述 投票:0回答:2

如果不进行强制转换,我无法查询

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

linq ado.net dataview
2个回答
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()));

我也尝试了

.Cast<DataRowView>()
就像你的 Main 方法一样,并且也编译了。


0
投票

这是因为

DataView
实现了非泛型
IEnumerable
LINQ 可以与 IEnumerable 一起使用吗?)。最重要的是,这有点令人困惑,因为
DataView
枚举器返回
DataRowView
类型的对象。

使用

.Cast<DataRowView>()
Linq 方法,因为您知道它们都是这种类型。从技术上讲,您可以使用
.OfType<DataRowView>()
,但请注意,它会默默地忽略集合中不属于该类型的任何对象,而
Cast
将抛出异常(https://stackoverflow.com/a /4015967/530545).

© www.soinside.com 2019 - 2024. All rights reserved.