我的应用程序在 ASP.NET 4.0 下运行,它使用 BLToolkti 作为 ORM 工具。
我有一些可查询的表达式:
var q = db.GetTable<T>()
.Where(tb=>tb.TeamId==MyTeamId && tb.Season==MySeasonId)
.OrderByDescending(tb=>tb.Id)
.Take(20)
.Reverse()
尝试转换 q.ToList() 会导致以下错误:
如果我从可查询对象中删除“.Reverse()”,一切正常。
使用 .Reverse() 的可查询对象无法转换为 SQL 的原因是什么?那是 BLToolkit 的限制吗?有什么解决方法吗?
谢谢!
最佳答案
很明显其他 LINQ 方法转换为( where, order by, top(20)
),但是 Reverse()
会转换为什么?我想不出我见过的模仿这种行为的 SQL 语句,当您查询数据库时,您的 LINQ 语句最终必须解析为有效的 SQL。
这可能不是您想要的,但一种选择是首先使用 ToList()
执行查询,然后应用 Reverse()
:
var q = db.GetTable<T>()
.Where(tb => tb.TeamId == MyTeamId && tb.Season == MySeasonId)
.OrderByDescending(tb => tb.Id)
.Take(20)
.ToList()
.Reverse();
或者,您可以先获取计数并跳过那么多记录,但如果记录数在调用之间发生变化,这可能会不准确。另外,它是两个查询,而不是一个。
var totalRecords = db.GetTable<T>()
.Count(tb => tb.TeamId == MyTeamId && tb.Season == MySeasonId);
var q = db.GetTable<T>()
.Where(tb => tb.TeamId == MyTeamId && tb.Season == MySeasonId)
.Order(tb => tb.Id)
.Skip(totalRecords)
.Take(20);
关于c# - 为什么 Reverse() 不能转换成 SQL?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25276760/