gpt4 book ai didi

c# - LINQ GroupBy 与 SQLite.EF6 导致 'APPLY joins are not supported' 异常

转载 作者:太空狗 更新时间:2023-10-30 01:14:12 26 4
gpt4 key购买 nike

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

最佳答案

我可以建议以下替代查询,它应该转换为基于 NOT EXISTS 条件的 SQL 查询:

var result = db.VersionedEntity
.Where(e => !db.VersionedEntity.Any(e2 => e2.Id == e.Id && e2.Version > e.Version))
.ToList();

这只是对要求的不同解释 - 如果没有其他记录具有相同的 Id 和更大的 Version,则选择该记录。

关于c# - LINQ GroupBy 与 SQLite.EF6 导致 'APPLY joins are not supported' 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45207172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com