“无法解析符号选择”尝试将LINQ与DataRowCollection一起使用

时间:2011-01-12 18:29:30

标签: .net linq

我正在尝试使用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;
    }
}

2 个答案:

答案 0 :(得分:7)

我认为你不能使用Linq而不是DataSet行,因为它没有实现IEnumerable<T>。如果您将System.Data.DataSetExtensions的引用添加到项目中,则可以使用扩展方法,这样就可以实现:

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

另见SO上的前一个答案:LINQ query on a DataTable

来自DataTableExtensions.AsEnumerable的msdn文章:

  

语言集成查询(LINQ)   查询处理数据源   实现IEnumerable接口   或IQueryable界面。该   DataTable类没有实现   任何一个接口,所以你必须调用   AsEnumerable方法使用   DataTable作为From中的源   LINQ查询的子句。你也可以   获取自定义,特定于域   运算符,如CopyToDataTable,by   返回一个IEnumerable对象。

答案 1 :(得分:1)

也许你需要帮助LINQ解决这个问题。它无法解析行的类型?

尝试:

return (from row as DataRow 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();

修改

愚蠢的VB / C#脑粉碎:P

尝试:

return (from DataRow 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();