我遇到以下Linq查询问题(demandNb是一个过滤器选项,作为字符串):
Return (From auto In entity.DEMDT_AUTMT _
Where (String.IsNullOrEmpty(demandNb) OrElse auto.DEMND_NB = demandNb) _
Order By auto.NO_DEMND Descending _
Select auto).ToList()
如果过滤器字段为空,我的目标是获得对数据库的所有要求。如果有过滤器,该函数应返回与过滤器匹配的所有需求。
目前,当我尝试使用.ToList()将IQueryable集合转换为列表时,会抛出以下错误:
Conversion from string "" to type 'Double' is not valid.
问题是,当demandNb等于""时,此指令auto.DEMND_NB = demandNb
仍然执行,导致转换错误。
当我在OrElse之后移除部件时,一切正常(虽然这不是我想要的行为,但我希望过滤器能够完成工作!)。我也尝试将结果放入变量(可以工作),然后将其转换为列表,并且只在调用.ToList()时抛出错误。奇怪...
我有没有看到的东西,为什么OrElse
没有按预期工作?
修改
我将实现更多这样的过滤器字段(如需求所有者,需求日期等),因此在执行查询之前我无法验证过滤器是否为空
答案 0 :(得分:2)
如果我不得不猜测,我会说auto.DEMND_NB
的类型为Double
,而demandNb
显然是string
。这与OrElse
无关:您只是想比较不兼容类型的两个值。
由于demandNb
的值与数据中的每一行没有关联,我建议做这样的事情(原谅C#):
var autos = entity.DEMDT_AUTMT;
if(!string.IsNullOrEmpty(demandNb))
{
var demandNbDouble = double.Parse(demandNb);
autos = autos.Where(auto => auto.DEMND_NB == demandNbDouble);
}
autos = autos.OrderBy(...);