2011-01-12 27 views
2

我试图使用LINQ行从列值遍历在一个DataTable,并实例化对象。下面显示了棘手的代码。“无法解析符号选择”尝试使用LINQ与DataRowCollection

的问题是,代码将无法编译。恶意错误消息是“无法解析符号选择”。我很满意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; 
    } 
} 
+0

你得到一个线突出显示错误消息? – 2011-01-12 18:45:28

回答

7

我不认为你可以使用LINQ通过DataSet行,因为它不实现IEnumerable<T>。如果你System.Data.DataSetExtensions添加到您的项目的引用,你虽然可以使用扩展方法,它允许你:

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

也可参阅所以这之前的答案:LINQ query on a DataTable

从MSDN文章DataTableExtensions.AsEnumerable

语言集成查询(LINQ) 查询关于数据源的工作, 实现IEnumerable接口 或IQueryable的INTERF高手。 DataTable类不会实现 的任一接口,所以您必须调用 AsEnumerable方法将 DataTable用作LINQ查询的从 子句中的源。您也可以 获得定制的,特定领域的 运营商,如CopyToDataTable,通过 返回一个IEnumerable对象。

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(); 
+0

不,不行。但这是一个很有希望的建议! – 2011-01-12 18:43:02

+0

看到我的编辑,希望这是诀窍。 – 2011-01-12 18:56:09