我的表VersionedEntities看起来像这样:
+----+--------------+---------+
| Id | Name | Version |
+----+--------------+---------+
| 1 | FirstEntity | 1 |
+----+--------------+---------+
| 2 | SecondEntity | 2 |
+----+--------------+---------+
| 1 | ThirdEntity | 3 |
+----+--------------+---------+
版本是主键.
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联接.
我发现,SQLite(source)仅实现了LEFT OUTER JOIN.我猜想LINQ GroupBy()使用的是未实现的联接之一.
我想知道是否有解决方法,或者是否可以将查询重写为与SQLite兼容的东西.
解决方法:
我可以建议以下替代查询,该查询应转换为基于SQL查询的NOT EXISTS条件:
var result = db.VersionedEntity
.Where(e => !db.VersionedEntity.Any(e2 => e2.Id == e.Id && e2.Version > e.Version))
.ToList();
这只是对需求的不同解释-如果没有其他具有相同ID和更大版本的记录,请选择该记录.
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!