为什么Reverse()不能转换为SQL



我的应用程序在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()会导致以下错误:

序列的表(TeamBudget)。式中(tb) => (tb)TeamId = =值(VfmElita.DataLogicLayer.Teams.Team + TeamBudget + & lt;> c__DisplayClass78) .teamId)以及(结核病。赛季= =值(VfmElita.DataLogicLayer.Teams.Team + TeamBudget + & lt;> c__DisplayClass78) .season .OrderByDescending (tb)))=> Convert(tb.Id)). take (20). reverse()'不能转换为SQL

如果我从可查询对象中删除". 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);

相关内容

  • 没有找到相关文章

最新更新