当前位置:首页 > 数据库 > SQlite

带有SQLite.EF6的LINQ GroupBy导致“不支持APPLY联接”异常

我的表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)!