将DataTable转换为LINQ:无法查询多个字段

时间:2010-07-27 13:13:41

标签: c# linq datatable

导入电子表格我已使用该数据填充了DataTable对象并返回了预期结果。

尝试将其置于格式中我可以轻松查询以搜索问题记录我已完成以下操作

public void Something(DataTable dt)
{
     var data = from row in dt.AsEnumerable()
                select row["Order"].ToString();
}

按预期工作,给我一份订单清单。但是,我无法向此EnumerableRowCollection添加其他字段。尝试按如下方式添加其他字段会给我一个错误

public void Something(DataTable dt)
{
     // row["Version"] throws an error on me
     var data = from row in dt.AsEnumerable()
                select row["Order"].ToString(), row["Version"].ToString();
}

错误:“无法在此范围内声明名为'row'的局部变量,因为它会为'row'赋予不同的含义,'row'已在'子'范围内用于捐赠其他内容”

我想我需要别名列名,但我没有运气。我在这里缺少什么?

3 个答案:

答案 0 :(得分:4)

听起来你正在编写糟糕的选择声明。请尝试以下方法:

public void Something(DataTable dt)
{
    var data = from row in dt.AsEnumerable()
               select new { 
                            Order = row["Order"].ToString(), 
                            Something = row["Something"].ToString(),
                            Customer = row["Customer"].ToString(),
                            Address = row["Address"].ToString()
                          };
}

这将创建一个新的匿名类型对象集合,您可以根据需要进行迭代和使用。但请记住,您希望能够从函数返回data。如果您需要该功能,则需要创建一个要使用的具体类型(代替匿名类型)。

答案 1 :(得分:2)

我认为您应该像这样的查询使用select new,例如:

var q = from o in db.Orders
        where o.Products.ProductName.StartsWith("Asset") && 
              o.PaymentApproved == true
        select new { name   = o.Contacts.FirstName + " " +
                              o.Contacts.LastName, 
                     product = o.Products.ProductName, 
                     version = o.Products.Version + 
                              (o.Products.SubVersion * 0.1)
                   };

答案 2 :(得分:0)

您可能需要以下内容。

var data = from row
           in dt.AsEnumerable()
           select new { Order = row["Order"].ToString(), Version = row["Version"].ToString() };