数据库
首页 > 数据库> > 为什么不能将Reverse()转换为SQL?

为什么不能将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()会导致以下错误:

Sequence ‘Table(TeamBudget).Where(tb => ((tb.TeamId ==
value(VfmElita.DataLogicLayer.Teams.Team+TeamBudget+<>c__DisplayClass78).teamId)
AndAlso (tb.Season ==
value(VfmElita.DataLogicLayer.Teams.Team+TeamBudget+<>c__DisplayClass78).season))).OrderByDescending(tb
=> Convert(tb.Id)).Take(20).Reverse()’ cannot be converted to SQL.

如果我从可查询对象中删除“ .Reverse()”,则一切正常.

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

谢谢!

解决方法:

很明显,其他LINQ方法可以转换为什么(在哪里,按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);

标签:reverse,iqueryable,bltoolkit,sql,c
来源: https://codeday.me/bug/20191121/2051367.html