3

我的应用程序在 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).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()' 无法转换为 SQL。

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

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

谢谢!

4

1 回答 1

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);
于 2014-08-13T01:54:04.110 回答