如何修复"带有语句体的lambda表达式无法转换为表达式树“for sql for execution?

时间:2017-10-04 17:11:34

标签: c# .net linq linq-to-sql sql-order-by

我必须对此表格进行排序"报告" on嵌套表中的数据。即每个报告项目都有一些与之关联的网络,每个网络都有一个状态属性,我需要对报告列表进行排序。这是我到目前为止能够获得的一个示例,但是我无法以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中执行。

1 个答案:

答案 0 :(得分:2)

看起来switch语句没有SQL equivelant,并且它希望在Linq to Objects中运行它。

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

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