【问题标题】:C# Dynamic Linq - Case StatementsC# Dynamic Linq - 案例陈述
【发布时间】:2020-04-29 22:54:01
【问题描述】:

我在使用 Dynamic Linq 时遇到了一些问题,我希望有人能提供帮助。我面临的问题是我需要按特定顺序订购列表。在 SQL 中,我会这样写:

ORDER BY CASE WHEN Blah = 'blah' THEN 1 ELSE 0 END

我将如何使用 Dynamic Linq 完成此任务?

我尝试过类似的方法:

listToSort.AsQueryable().OrderBy("CASE WHEN Blah = 'blah' THEN 1 ELSE 0 END")

但这会返回错误

类型中不存在属性或字段“CASE”

此代码在运行时生成为表达式列表。 所以我使用 Dynamic Linq 将表达式用作字符串。

【问题讨论】:

    标签: c# dynamic-linq


    【解决方案1】:

    您可以使用conditional operator:

    listToSort.AsQueryable()
        .OrderBy(x => x.Blah == "blah" ? 1 : 0); 
    

    您也可以使用它,因为 truefalse“更多”:

    listToSort.AsQueryable()
        .OrderBy(x => x.Blah == "blah"); 
    

    似乎不支持动态 LINQ CASE 或条件运算符。但是您可以使用另一个关键字:iif

    listToSort.AsQueryable()
        .OrderBy("iif(Blah = 'blah', 1, 0)"); 
    

    Overview 的动态 LINQ 表达式方法和关键字。

    【讨论】:

    • 我不能这样做,因为 order by 的其余部分是作为字符串编写的。例如。 listToSort.AsQueryable().OrderBy("CASE WHEN Blah = 'blah' THEN 1 ELSE 0 END, DateCreated DESC") 此外,订单是在运行时创建的,这就是我使用动态 linq 的原因
    • @RianMostert:我已经编辑了我的答案。我不熟悉动态 LINQ,所以这对我自己来说也很有趣。
    • 非常感谢,这正是我想要的!也谢谢你的链接!
    【解决方案2】:

    有点老但是很有趣的问题。

    Tim 将我们引向了正确的方向:我们可以使用嵌套的 iif 语句来像 case 语句一样工作。

    我的工作示例:我想首先按有需求和工人的项目排序,然后按只有需求的项目,然后按只有工人的项目:

    iif(Workers.Count > 0 AND Demands.Count > 0, 3, iif(Demands.Count > 0, 2, iif(Workers.Count > 0, 1 , 0)))
    

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2016-05-13
      • 2016-02-21
      • 1970-01-01
      • 2012-09-08
      • 2013-10-14
      相关资源
      最近更新 更多