我遇到了问题,我觉得这样做很简单,我做得不对。
我有一个简单的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 :(得分: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") }
不是选择单个属性,而是选择整个实体。
答案 1 :(得分:0)
您的select语句明确要求输入一列。以下信息与您相关,希望它有意义
有一条规则要注意哪个是LINQ规则,而不是LINQ to Entities。当您在投影中创建一个on the fly属性并且您正在使用函数创建时,LINQ无法确定要调用该属性的内容,因此您必须使用变量名称“fullname”来命名它。 / p>
Dim custs = From cust In .Customer By cust.FullNameAlpha
SELECT cust.ContactID, fullname = cust.LastName.Trim & "," & cust.FirstName
答案 2 :(得分: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();
因为DataTable不是IEnumerable,所以我使用了AsEnumerable()方法,该方法将返回一个强类型的DataRow集合。您还可以显式指定类型,如以下代码所示:
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();
希望它有所帮助!