将 IQueryable<int> 转换为 <int>

Posted

技术标签:

【中文标题】将 IQueryable<int> 转换为 <int>【英文标题】:convert IQueryable<int> to <int> 【发布时间】:2012-01-07 18:14:09 【问题描述】:

我想在数据库中选择我的价格水平以与整数进行比较。但这是错误的:运算符“==”不能应用于“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");
 

 

【问题讨论】:

【参考方案1】:

var list_pricelevel

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

我不使用 SQL 语法(仅使用 lambda),但最后您需要等效于 .FirstOrDefaultSingleFirst。基本上占了第一排。

【讨论】:

对不起,你能解释清楚吗?我必须将 .First 添加到我的 linq 吗? 是的。因为 LINQ 无法知道那里会有一排。据它所知,可能有几行,而不是一个 list_pricelevel 值,你会得到多个。【参考方案2】:

替换:

if (list_pricelevel == 3) 

与:

if (list_pricelevel.First() == 3) 

如您在此处看到的:http://msdn.microsoft.com/en-us/library/bb291976.aspx,如果您确定有结果或使用FirstOrDefault...

【讨论】:

【参考方案3】:

这是我的建议:

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

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

解释:

list_pricelevel 是满足您的 where 子句的 IEnumerable 项目。

【讨论】:

【参考方案4】:

您需要从您的收藏中获取第一个项目。

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

当您获得 LinQ 表达式的结果时,您将始终拥有结果集列表。

所以在你的代码中查询如下:

var list_pricelevel = from c in cm.DataContext.Customers where c.WebAccount == userName select c.PriceLevel;

list_pricelevel 将采用 List 即 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.

【讨论】:

以上是关于将 IQueryable<int> 转换为 <int>的主要内容,如果未能解决你的问题,请参考以下文章

IQueryable<decimal> 转十进制

IList<T> 到 IQueryable<T>

将 IQueryable<EntityObject> 转换为 IQueryable<Specific>

以更好的性能将 IQueryable<X> 转换为 IQueryable<Y>

如何将 ODataQueryOptions<T> 应用于 IQueryable<X>

如何将 IEnumerable<t> 或 IQueryable<t> 转换为 EntitySet<t>?