Linq 将 any 作为 linq 查询中的条件变量列出

Linq list any as conditional variables inside linq query

提问人:shasabbir 提问时间:7/16/2023 最后编辑:shasabbir 更新时间:7/16/2023 访问量:65

问:

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

但我无法确定它。如果这是一个愚蠢的错误,请原谅我并帮助我。

C# asp.net .NET LINQ

评论

1赞 abolfazl sadeghi 7/16/2023
请展示您的错误以及您的示例和期望
1赞 Adalyat Nazirov 7/16/2023
问题是您使用的是 Linq to Entities,因此不能在 中使用。你能提供更多关于你的代码的细节吗?什么是time_range,它来自哪里?Any()Where()
0赞 shasabbir 7/16/2023
为您编辑了问题。请检查
0赞 Svyatoslav Danyliv 7/16/2023
中有多少个项目?如果超过 100,则需要使用第三方扩展。time_ranges

答:

0赞 Wiktor Kot 7/16/2023 #1

您面临的问题是由于 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);
}

评论

0赞 shasabbir 7/16/2023
感谢您的回复,这是我想克服的事情,因为范围的长度至少为 50k。 您的回复丰富了我的知识,谢谢。
0赞 tchrist 7/17/2023
这个答案看起来至少部分是在 ChatGPT 等 AI 生成器的帮助下编写的。请注意,在 Stack Overflow 上正式禁止发布 AI 生成的输出。如果这个答案确实是由人工智能生成的,那么我强烈建议你在给自己带来更大的麻烦之前删除它:我们在这里认真对待抄袭。请阅读:为什么目前不允许发布 GPT 和 ChatGPT 生成的答案
1赞 Wiktor Kot 7/18/2023
所以我想现在正在考虑将写出感性的回应作为人工智能生成?很高兴知道。
0赞 shasabbir 9/4/2023
@WiktorKot自己使用 chatgpt 进行解决方案的结果远不及此,我相信你 bruv,不要担心这个弱机器人。有好的一天