C# 动态 Linq - Case 语句

3

我在使用动态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'

此代码在运行时生成为表达式列表。 因此,我正在使用动态Linq将表达式作为字符串使用。

2个回答

6

您可以使用条件运算符

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)"); 

动态LINQ表达式方法和关键字概述。请点击此处了解更多信息。

我无法这样做,因为order by的其余部分是以字符串形式编写的。例如:listToSort.AsQueryable().OrderBy("CASE WHEN Blah = 'blah' THEN 1 ELSE 0 END, DateCreated DESC")此外,order by是在运行时创建的,这就是为什么我使用动态linq的原因。 - Rian Mostert
@RianMostert:我已经编辑了我的回答。我不熟悉动态LINQ,所以这对我自己也很有趣。 - Tim Schmelter
非常感谢,这正是我在寻找的!同时也感谢您提供的链接! - Rian Mostert

0

这是一个有点老但很有趣的问题。

Tim 指出了正确的方向:我们可以使用嵌套的 iif 语句来模拟 case 语句。

以下是我的工作示例:我想首先按照既有需求又有工人的项目排序,然后按照只有需求的项目排序,最后按照只有工人的项目排序:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接