我的表VersionedEntities
看起来像这样:
+----+--------------+---------+
| Id | Name | Version |
+----+--------------+---------+
| 1 | FirstEntity | 1 |
+----+--------------+---------+
| 2 | SecondEntity | 2 |
+----+--------------+---------+
| 1 | ThirdEntity | 3 |
+----+--------------+---------+
Version
是主键。
VersionedEntity
上课:
[Table("VersionedEntities")]
public class VersionedEntity
{
public int Id { get; set; }
public string Name { get; set; }
[Key]
public long Version { get; set; }
}
我想选择每个Id
的最新版本,结果如下:
+----+--------------+---------+
| Id | Name | Version |
+----+--------------+---------+
| 2 | SecondEntity | 2 |
+----+--------------+---------+
| 1 | ThirdEntity | 3 |
+----+--------------+---------+
使用Microsoft SQL Server
作为数据库时,我已经有了一个有效的查询:
List<VersionedEntity> versionedEntities;
using (var dbContext = _createDbContext())
{
versionedEntities = dbContext.VersionedEntity
.GroupBy(versionedEntity => versionedEntity.Id)
.Select(group => group.OrderByDescending(versionedEntity => versionedEntity.Version).FirstOrDefault()).ToList());
}
我想使用SQLite作为数据库,但在使用SQLite时,上述查询会生成NotSupportedException
,并显示消息:APPLY joins are not supported
。
我发现只有LEFT OUTER JOIN
在SQLite中实现(source)。我猜LINQ GroupBy()
正在使用其中一个未实现的连接。
我想知道是否有解决方法,或者我是否可以将查询重写为与SQLite兼容的内容。
答案 0 :(得分:4)
我可以建议以下替代查询,该查询应转换为基于SQL查询的NOT EXISTS
条件:
var result = db.VersionedEntity
.Where(e => !db.VersionedEntity.Any(e2 => e2.Id == e.Id && e2.Version > e.Version))
.ToList();
它只是对要求的不同解释 - 如果没有其他记录具有相同的Id
和更大Version
,则选择记录。