如何解决 sql 执行时“带有语句体的 lambda 表达式无法转换为表达式树”?

How to fix "A lambda expression with a statement body cannot be converted to an expression tree” for sql for execution?

我必须根据嵌套 table 中的数据对 "Report's" 中的 table 进行排序。 IE。每个 Report 项都有许多与之关联的 Net,并且每个 Net 都有一个状态属性,我需要根据该属性对 Reports 列表进行排序。这是我到目前为止能够得到的一个例子,但是我无法以一种可以接受 table for IOrderedQueryable 的方式编写它,因为我需要它仍然被翻译成 SQL 并通过它而不是我编写代码的地方执行:

var orderedReports = reports.OrderBy((r) =>
{
    switch (r.Nets.Any(n => n.Status.Contains("New")) ? "New" :
            r.Nets.Any(n => n.Status.Contains("Updated")) ? "Updated" :
            r.Nets.Any(n => n.Status.Contains("Ignored")) ? "Ignored" : "None" )
    {
        case "New": return 1;
        case "Updated": return 2;
        case "Ignored": return 3;
        case "None": return 4;
        default: return 5;
    }
}).ThenBy(r => r.ReportID); 

我意识到许多报告可能具有相似甚至匹配数量的状态,因此在初始排序后,我会按该报告的 ID 进行排序。我基本上希望首先具有至少一个 "New" 状态的所有报告,然后是其他报告,如上所述。我还想重申,我需要确保它保留在 IOrderedQueryable 中,因为在对数据库进行查询时需要在 SQL 中执行。

看起来 switch 语句没有 SQL 等价物,它期望在 Linq to Objects 中 运行 this。

条件运算符似乎有直接转换: https://www.codeproject.com/Articles/38264/How-to-Create-T-SQL-CASE-Statements-With-LINQ-To-S

我强烈建议在 LinqPad 中进行测试,因为它可以生成 SQL 等效项来帮助您进行调试。