调用 ToList() 时出现 LINQ InvalidOperationException

LINQ InvalidOperationException when calling ToList()

我想使用以下代码更新数据库中 table 中的记录:

context.Events
        .Where(eventDb => !events.Any(@event => eventDb.Guid == @event.Guid))
        .ToList()
        .ForEach(eventDb => eventDb.IsCurrent = false);

但每次调用 ToList() 时都会出现以下错误,我不清楚:

System.InvalidOperationException: The LINQ expression 'event => EntityShaperExpression: 
    WawAPI.Models.Event
    ValueBufferExpression: 
        ProjectionBindingExpression: EmptyProjectionMember
    IsNullable: False
.Guid == event.Guid' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'.

我不确定我做错了什么,如果有任何帮助,我将不胜感激。

我认为问题在于 EventDb.Guid == @event.Guid 无法转换为原始数据库 SQL。 Guid 是什么类型的? 看看如果将 ToList() 移到 Where 子句之前会发生什么。

我认为问题在于您要求 SQL 服务器对 events 执行 .Any() 操作,这可能是某种 in-memory C# 对象,并且SQL 服务器上不存在并且太复杂,无法发送到 SQL。

如果您将 events 中的 Guid 提取到一个简单的字符串列表中,那么发送到 sql 就足够简单了。您还需要稍微更改您的 linq 查询,但我认为这将为您提供所需的结果。

var eventGuids = events.select(a=>a.Guid).ToList();

context.Events
        .Where(eventDb => !eventGuids.Contains(event.Guid))
        .ToList()
        .ForEach(eventDb => eventDb.IsCurrent = false);