【问题标题】:Cannot convert type 'System.Linq.IQueryable<double?>' to 'float'无法将类型“System.Linq.IQueryable<double?>”转换为“float”
【发布时间】:2013-11-09 15:56:54
【问题描述】:
我有一个名为 InventoryItem 的表,它由列 ItemDescription 和 Item BalanceQty 组成。我想获取在组合框中选择的 ItemName 的 BalanceQty。为此,我在我的数据访问层中创建了一个方法并传递了字符串参数表示此方法的 ItemDescription 的字符串值。这已使用实体框架实现。这就是我的代码的外观:
public float GetAvailableQty(string itemName)
{
float availableQty =(from table in context.InventoryItem
where table.ItemDescription == itemName
select table.BalanceQuantity);
return availableQty;
}
但它给了我以下错误-
无法将类型“System.Linq.IQueryable”转换为“float”
我哪里错了?
【问题讨论】:
标签:
c#
linq
entity-framework
【解决方案1】:
可能你需要这个:
double availableQty =(from table in context.InventoryItem
where table.ItemDescription == itemName
select table.BalanceQuantity).Sum();
IQueriable 返回一个表达式树。像这样查询的结果是一个行集,它可以通过使用 ToList() 或通过分配给 IEnumerable 隐式实现为 IEnumerate。但无论如何,它将是行设置,而不是单个值。如果您确定查询返回单个,则使用 .Single() 或 SingleOrDefault。请参阅 IQueriable 的其他扩展方法。
否则,如果您需要一个数组,则将结果分配给某个 IEnumerable 变量。
【解决方案2】:
因为你的 Linq 返回一个 Iqueryable ...
假设您有 3 行,其中一个项目具有 3 个不同的数量(我知道这很傻,但想想每个项目可以有多个值的其他东西,比如油漆的颜色)。您的 linq 将返回三个数量,并且您假设它是一个数字
您可以使用First 或FirstOrDefault 来获取第一项或该对象的默认值。
在您的情况下,这无关紧要,但您应该了解 Linq 的工作原理以及它返回的内容...
另一个例子:
假设:List numbers = {1,2,3,4,5,6}(假设它们是整数)。
你这样做:var small_numbers = numbers.Where(x => x<4)
你得到的是你可以查询的东西:foreach (var small in small_numbers) {...})。结果不是整数。
你可以取第一个,最后一个,事实上,那将是一个 int。但你得到的是一个集合。所以,即使你这样做:var one_result = numbers.Where(x => x<2),one_result 也不是 int。