“无法解析符号选择";尝试将LINQ与DataRowCollection一起使用 [英] "Cannot Resolve Symbol Select" Trying to use LINQ with DataRowCollection

查看:87
本文介绍了“无法解析符号选择";尝试将LINQ与DataRowCollection一起使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用LINQ遍历DataTable中的行,并从列值实例化对象.棘手的代码如下所示.

问题在于代码甚至无法编译.恶意的错误消息是无法解析符号选择".

我对DataRowCollection实现IEnumerable(从System.Data.InternalDataCollectionBase获取它)感到满意,因此您会认为以下内容没有问题(显然,我认为这是错误的).

我在我的项目中包含System.Linq System.Data和System.Data.SqlClient.它还具有所有必要的参考.之前,我在整个应用程序中一直使用LINQ(主要是POCO和XDocuemnts的列表),这是我第一次看到此特定消息.

是否有解决建议?

using (var command = connection.CreateCommand())
{
    command.CommandText = "dbo.sp_pTicklerContacts_sel_W_ContactRole_by_ComKey";
    command.CommandTimeout = 120;
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("@iComKey", SqlDbType.Int).Value = companyKey;

    using (var adapter = new SqlDataAdapter(command))
    {
        var dataset = new DataSet();
        adapter.Fill(dataset);
        if (dataset.TableCount() > 0 && dataset.Tables[0].Rows.Count > 0)
        {
            return (from row in dataset.Tables[0].Rows
                    select new TicklerContact
                               {
                                   CompanyKey = row.ToInt32("iTicklerContact"),
                                   Contact = row.ToString("ccontact"),
                                   ContactKey = row.ToInt32("iconkey"),
                                   TicklerContactKey = row.ToInt32("iTicklerContactKey"),
                                   Role = row.ToString("contactrole"),
                                   Exists = row.ToBool("contactexists")
                                 }).ToList();

        }
        return null;
    }
}

解决方案

我认为您不能在DataSet行上使用Linq,因为它没有实现IEnumerable<T>.如果您在项目中添加对System.Data.DataSetExtensions的引用,则可以使用扩展方法,该方法可以实现以下目的:

 return (from row in dataset.Tables[0].AsEnumerable()
 ...

另请参见以下关于SO的先前答案:对DataTable的LINQ查询

摘自msdn文章中的 DataTableExtensions.AsEnumerable :

语言集成查询(LINQ) 查询适用于以下数据源 实现IEnumerable接口 或IQueryable接口.这 DataTable类未实现 任一个介面,因此您必须呼叫 AsEnumerable方法使用 DataTable作为From中的源 LINQ查询的子句.你也可以 获取自定义的,特定于域的 运算符,例如CopyToDataTable,由 返回IEnumerable对象.

I'm trying to use LINQ to iterate over the rows in a DataTable, and instantiate objects from the column values. The tricksy code is shown below.

The problem is that the code won't even compile. The nefarious error message is "cannot resolve symbol Select".

I'm satisfied that DataRowCollection implements IEnumerable (it gets it from System.Data.InternalDataCollectionBase), so you would think there'd be no problem with the following (obviously, I'm wrong on that count).

I have included System.Linq System.Data, and System.Data.SqlClient in my project. It also has all the necessary references. I've been using LINQ throughout the app before (mostly with lists of POCOs and XDocuemnts), and this is the first time I've seen this particular message.

Any advice on how to resolve it?

using (var command = connection.CreateCommand())
{
    command.CommandText = "dbo.sp_pTicklerContacts_sel_W_ContactRole_by_ComKey";
    command.CommandTimeout = 120;
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("@iComKey", SqlDbType.Int).Value = companyKey;

    using (var adapter = new SqlDataAdapter(command))
    {
        var dataset = new DataSet();
        adapter.Fill(dataset);
        if (dataset.TableCount() > 0 && dataset.Tables[0].Rows.Count > 0)
        {
            return (from row in dataset.Tables[0].Rows
                    select new TicklerContact
                               {
                                   CompanyKey = row.ToInt32("iTicklerContact"),
                                   Contact = row.ToString("ccontact"),
                                   ContactKey = row.ToInt32("iconkey"),
                                   TicklerContactKey = row.ToInt32("iTicklerContactKey"),
                                   Role = row.ToString("contactrole"),
                                   Exists = row.ToBool("contactexists")
                                 }).ToList();

        }
        return null;
    }
}

解决方案

I don't think you can use Linq over DataSet rows since it doesn't implement IEnumerable<T>. If you add a reference to System.Data.DataSetExtensions to your project you can use an extension method though, that allows you this:

 return (from row in dataset.Tables[0].AsEnumerable()
 ...

Also see this previous answer on SO: LINQ query on a DataTable

From the msdn article for DataTableExtensions.AsEnumerable:

Language-Integrated Query (LINQ) queries work on data sources that implement the IEnumerable interface or the IQueryable interface. The DataTable class does not implement either interface, so you must call the AsEnumerable method to use the DataTable as a source in the From clause of a LINQ query. You can also obtain custom, domain-specific operators, such as CopyToDataTable, by returning an IEnumerable object.

这篇关于“无法解析符号选择";尝试将LINQ与DataRowCollection一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆