【问题标题】:Unexpected 'OrElse' behavior in Linq queryLinq 查询中出现意外的“OrElse”行为
【发布时间】:2012-03-26 22:15:07
【问题描述】:

我在使用以下 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 没有按预期工作?

编辑:

我将实现更多这样的过滤器字段(如需求所有者、需求日期等),因此在执行查询之前我无法验证过滤器是否为空

【问题讨论】:

    标签: vb.net linq .net-4.0 ado.net


    【解决方案1】:

    如果我不得不猜测,我会说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(...);
    

    【讨论】:

    • DEMND_NB 是一个整数(缺少的 CInt 太明显了,我没看到)。虽然,当 demandNb 为空或 null 时,表达式的其他部分根本不应该被计算,但它确实是,这让我感到困惑。
    • @Msonic:您说的是代码的编译时评估,它总是会知道变量的声明类型,所以即使runtime 执行永远不会到那个地步,你仍然会得到一个编译器错误。
    • 哦,我不知道。非常感谢!
    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多