EF Core Sqlite 中的 Linq 查询不起作用
Linq query on EFCore Sqlite does not work
我正在使用 EFCore SQLite,当 运行 使用 Linq 进行简单查询时,我注意到查询 Take().Last()
没有 return 预期的结果,示例代码:
// There are more than 10000 rows in the table
DbSet<DataEntry> set = ctx.Set<DataEntry>();
// this should return the first 20 rows
var current = set.OrderBy(row => row.Id).Take(20);
// first entry is right
long tStart = current.First().Time;
// This should have returned the last entry in the first 20 entries, but instead, it returned the last entry of the entire data set
long tEnd = current.Last().Time;
// so essentially it looks like this:
set.Last().Time == set.Take(20).Last().Time
看起来 Last
将 return 整个后备数据集中的最后一个条目,无论它基于哪个查询。我该如何解决这个问题?
在第一个和最后一个抓取之前在 current
上调用 ToList
?
//...code removed for brevity.
var current = set.OrderBy(row => row.Id).Take(20).ToList();
//...code removed for brevity.
已在 EF Core 2.0.1、SqlServer 中测试和复制,因此这似乎是 Last
/ LastOrDefault
常规查询转换中的当前 EF Core 错误。
查询
var last = set.OrderBy(row => row.Id).Take(20).Last();
翻译成
var last = set.OrderByDescending(row => row.Id).Take(20).First();
这当然不等价,总是 returns 整个序列的最后一条记录(Take
无效)。
我建议将其报告给 EF Core Issue Tracker。
同时,作为一种解决方法,您可以使用丑陋的显式等效项:
var last = set.OrderBy(row => row.Id).Take(20)
.OrderByDescending(row => row.Id).First();
我正在使用 EFCore SQLite,当 运行 使用 Linq 进行简单查询时,我注意到查询 Take().Last()
没有 return 预期的结果,示例代码:
// There are more than 10000 rows in the table
DbSet<DataEntry> set = ctx.Set<DataEntry>();
// this should return the first 20 rows
var current = set.OrderBy(row => row.Id).Take(20);
// first entry is right
long tStart = current.First().Time;
// This should have returned the last entry in the first 20 entries, but instead, it returned the last entry of the entire data set
long tEnd = current.Last().Time;
// so essentially it looks like this:
set.Last().Time == set.Take(20).Last().Time
看起来 Last
将 return 整个后备数据集中的最后一个条目,无论它基于哪个查询。我该如何解决这个问题?
在第一个和最后一个抓取之前在 current
上调用 ToList
?
//...code removed for brevity.
var current = set.OrderBy(row => row.Id).Take(20).ToList();
//...code removed for brevity.
已在 EF Core 2.0.1、SqlServer 中测试和复制,因此这似乎是 Last
/ LastOrDefault
常规查询转换中的当前 EF Core 错误。
查询
var last = set.OrderBy(row => row.Id).Take(20).Last();
翻译成
var last = set.OrderByDescending(row => row.Id).Take(20).First();
这当然不等价,总是 returns 整个序列的最后一条记录(Take
无效)。
我建议将其报告给 EF Core Issue Tracker。
同时,作为一种解决方法,您可以使用丑陋的显式等效项:
var last = set.OrderBy(row => row.Id).Take(20)
.OrderByDescending(row => row.Id).First();