LINQ Group与SQLite.EF6结果导致“不支持APPLY联接”异常

时间:2017-07-20 06:46:13

标签: c# entity-framework linq sqlite group-by

我的表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兼容的内容。

1 个答案:

答案 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,则选择记录。