提问人:shasabbir 提问时间:7/16/2023 最后编辑:shasabbir 更新时间:7/16/2023 访问量:65
Linq 将 any 作为 linq 查询中的条件变量列出
Linq list any as conditional variables inside linq query
问:
var log = db.ViewLogs.Where(d =>
time_ranges.Any(t => (d.FinishedWatchingAt > t.start) && (d.StartedWatchingAt < t.end))).ToList();
这里的time_ranges(这是一个帮助程序类,未连接到数据库)是来自以下类的对象列表
public class TimeRange
{
public DateTime start { get; set; }
public DateTime end { get; set; }
}
我收到的错误:
LINQ 表达式 't => EntityShaperExpression: Bscl.Models.ViewLog ValueBufferExpression: ProjectionBindingExpression:EmptyProjectionMember IsNullable:假 .FinishedWatchingAt > t.start & EntityShaperExpression: Bscl.Models.ViewLog ValueBufferExpression: ProjectionBindingExpression:EmptyProjectionMember IsNullable:假 .StartedWatchingAt < t.end & & __userIds_1.Contains(EntityShaperExpression: Bscl.Models.ViewLog ValueBufferExpression: ProjectionBindingExpression:EmptyProjectionMember IsNullable:假 .UserId)' 无法翻译。以可翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端评估。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101038。
但我无法确定它。如果这是一个愚蠢的错误,请原谅我并帮助我。
答:
您面临的问题是由于 Entity Framework 无法将某些 LINQ 操作转换为 SQL 查询。具体来说,问题在于将 Any 运算符与复杂对象列表 (time_ranges) 一起使用,该运算符不能直接转换为 SQL。数据库提供程序不知道如何在数据库服务器上执行这部分查询。
解决此问题的一种方法是重写查询以使其可被实体框架理解,或者通过首先将数据加载到内存中来在内存(客户端)中执行部分操作。请注意,对于大型数据集,这可能效率低下。
试试这个:
var log = new List<ViewLog>();
foreach (var range in time_ranges)
{
var temp = db.ViewLogs
.Where(d => d.FinishedWatchingAt > range.start && d.StartedWatchingAt < range.end)
.ToList();
log.AddRange(temp);
}
评论
Any()
Where()
time_ranges