2009-10-22 69 views
0

我遇到了问题,我觉得这很简单,我做得不对。将DataSet绑定到GridView

我有一个简单的ASP.NET项目。我有一个从Oracle数据库填充的DataSet。 DataSet中的表有两列:“account_code”和“account_descr”。

用户在搜索词中输入文本框。我使用LINQ进行查询以从DataSet中获取结果并将它们放入另一个变量中。

然后我尝试将变量绑定到gridview。

代码:

Dim results = AccountsDataSet.Tables("Results") 

Dim filteredResults = From q In results Where q.Item("account_code").ToString.StartsWith(search) Select q.Item("account_code") 

GridView1.DataSource = filteredResults 
GridView1.DataBind() 

代码为上述作品。唯一的是它只显示一列。我需要它来显示两列。但是,如果我改变LINQ行这样的:

Dim filteredResults = From q In results Where q.Item("account_code").ToString.StartsWith(search) Select q.Item("account_code"), q.Item("account_descr") 

它抛出错误“范围变量名可以由不带参数的简单或限定名称仅推断”

任何想法?

回答

0

您需要返回匿名类型来得到你所需要的所有属性,否则将返回所有的公共属性也将包括RowError和HasErrors。下面是我使用的代码:

gvCustomers.DataSource = from c in ds.Tables[0].AsEnumerable() 
             where c["FirstName"].ToString().StartsWith("J") 
             select new { FirstName = c["FirstName"].ToString(), LastName = c["LastName"].ToString() }; 
       gvCustomers.DataBind(); 

因为,数据表是我用这将返回的DataRow的强类型集合AsEnumerable()方法不IEnumerable的。您还可以明确指定类型,如下面的代码所示:

gvCustomers.DataSource = from DataRow c in ds.Tables[0].Rows 
              where c["FirstName"].ToString().StartsWith("J") 
              select new { FirstName = c["FirstName"].ToString(), LastName = c["LastName"].ToString() }; 
        gvCustomers.DataBind(); 

希望它有帮助!

+0

谢谢!这很好。我想我尝试了一些类似于第二个例子的东西,但我永远无法使它正常工作。 – 2009-10-22 16:48:20

0

纠正我,如果我错了,但不应该在LINQ线是这样的:

Dim filteredResults = From q In results Where q.Item("account_code").ToString.StartsWith(search) Select New With { .AccountCode = q.Item("account_code"), .AccountDesc = q.Item("account_descr") } 

而不是选择单一属性的,选择整个实体。

+0

我的理解是你可以做。当我选择整个事物并将其绑定到gridview时,它只显示列“RowError”和“HasErrors”。这就像它只显示了filteredResults的属性,而不是实际的结果。 – 2009-10-22 14:35:43

+0

我已经用匿名类型改变了一下这个例子。我不是VB专家,但这可能是你需要的。 欲了解更多信息,请访问:http://www.hookedonlinq.com/SelectOperator.ashx – pyrocumulus 2009-10-22 14:49:19

0

您的select语句显式要求一列。以下信息与你有关,希望它有道理

有一条规则要注意哪些是LINQ规则,而不是LINQ到实体。当您在投影中创建动态属性并且您正在使用函数执行此操作时,LINQ无法确定要调用该属性的内容,因此您必须按照我在此处使用变量名“fullname”命名该名称。

Dim custs = From cust In .Customer By cust.FullNameAlpha 
SELECT cust.ContactID, fullname = cust.LastName.Trim & "," & cust.FirstName