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