将IQueryable<int>转换为<int>

13

我想从数据库中选择我的价格级别以与整数进行比较。但是出现错误:运算符“==”不能应用于类型为“System.Linq.IQueryable”和“int”的操作数。 这是我的代码:

if (Request.IsAuthenticated){

CustomerModels cm = new CustomerModels();

string userName = Page.User.Identity.Name;
var list_pricelevel = from c in cm.DataContext.Customers
                      where c.WebAccount == userName
                       select c.PriceLevel;
 if (list_pricelevel == 3) {
    Response.Write("Welcome");
 }

 }
6个回答

16

变量 list_pricelevel

根据定义,这不是一个int,因为可以返回多行。

我没有使用SQL语法(只使用lambda),但最终您需要等效于.FirstOrDefault, SingleFirst。基本上是获取第一行。


请问,您能给我解释清楚吗?我是否需要在我的linq中添加“.First”? - Nothing
是的。因为LINQ无法知道那里会恰好有一行数据。它可能存在多行数据,而不是一个list_pricelevel值,你可能会得到多个值。 - Vilx-

4

2
当你使用LinQ表达式查询时,你将总是得到一组结果列表。
所以在你的代码中,当你进行以下查询时: var list_pricelevel = from c in cm.DataContext.Customers where c.WebAccount == userName select c.PriceLevel; list_pricelevel将以列表形式返回,即IQueryable列表,
因此你需要获取一个元素来与一个元素进行比较。
所以请使用以下代码:
if (list_pricelevel.Single() == 3) 
{ 
  Response.Write("Welcome");  
}

or

if (list_pricelevel.First() == 3) 
{ 
  Response.Write("Welcome");  
}


both the above code gives you only one result set value so you can equate with 3 for validation.

0

这是我的建议:

 if (list_pricelevel.First() == 3) 
 { 
      Response.Write("Welcome");  
 }

如果在Customers中没有满足where c.WebAccount == userName的项目,则可能会引发NullReferenceException。

解释:

list_pricelevel是一个IEnumerable,其中包含满足您的where子句的项目。


0

Linq 的美妙之处在于每个查询都返回一个 IQueryable,因此您可以推迟获取最终结果,直到您真正决定想要什么。换句话说,您可以在另一个查询上执行查询 :) 因此,为了从查询中获取实际数据,您应该对其执行命令,以返回您想要的内容。 在您的情况下,由于您希望查询仅返回一个值,任何像 "FirstOrDefault"、"Single" 或 "First" 这样的方法都可以解决问题。


0

你需要从你的集合中取得第一个项目。

if (list_pricelevel.First() == 3) {
   Response.Write("Welcome");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接