为什么Reverse()无法转换为SQL?

时间:2014-08-13 01:40:03

标签: c# sql reverse iqueryable bltoolkit

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

  

序列&#39;表(TeamBudget)。其中(tb =&gt;((tb.TeamId ==   值(VfmElita.DataLogicLayer.Teams.Team + TeamBudget + LT;&GT; c__DisplayClass78).teamId)   AndAlso(tb.Season ==   值(VfmElita.DataLogicLayer.Teams.Team + TeamBudget + LT;&GT; c__DisplayClass78)。.season)))OrderByDescending(TB   =&GT;转换(tb.Id))取(20).Reverse()&#39。无法转换为SQL。

如果我删除&#34; .Reverse()&#34;从可查询对象中一切正常。

带有.Reverse()的可查询对象无法转换为SQL的原因是什么?这是BLToolkit的限制吗?有解决办法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

很清楚其他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);