将 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),但最后您需要等效于 .FirstOrDefault
或 Single
或 First
。基本上占了第一排。
【讨论】:
对不起,你能解释清楚吗?我必须将 .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<EntityObject> 转换为 IQueryable<Specific>
以更好的性能将 IQueryable<X> 转换为 IQueryable<Y>