调用 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);
我想使用以下代码更新数据库中 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);