2010-07-27 51 views
3

导入电子表格我用这些数据填充了DataTable对象并返回预期结果。将DataTable转换为LINQ:无法查询多个字段

试图把这个变成一种格式,我可以很容易地查询到搜索问题记录我做了以下

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(); 
} 

错误:“名为‘行’的局部变量不能在此范围内声明,因为它会给予不同的意义,这是已经在使用‘行’一个'孩子'范围捐赠别的东西“

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

+0

如果你发布*失败的*代码,而不仅仅是没有做到你想要的代码,这真的会有帮助。 – 2010-07-27 13:15:23

+0

已经在那:) – Mohgeroth 2010-07-27 13:15:45

+0

您正在使用变量名“行”两次。也许你应该发布代码失败的完整示例,以便我们可以帮助你。 – sloth 2010-07-27 13:16:58

回答

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。如果你需要这个功能,你需要创建一个具体的类型来使用(代替匿名类型)。

+0

是的,我忘记了新的关键字。仍然不习惯这些匿名代表和所有这些,我忘了。谢谢! – Mohgeroth 2010-07-27 13:21:40

2

我认为你应该使用新的选择这样的查询,例如:

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) 
        }; 
0

您可能想要以下内容。

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