ef 中无法提前使用 linq 查询的解决办法?

ef 中有如下的查询条件,在 .ToList 之后它可以被翻译为 sql,但在 .ToList 之前不行,我该如何写出等价可被翻译的 .Where 条件?

.Where(x => selectedBookItems.Any(y => y.BookID == x.BookID))
                    .Where(x => etSearchTitle.Text.Split(new String[] { " " }, StringSplitOptions.RemoveEmptyEntries)
                        .Any(y => x.Title.Contains(y) || x.PinYin.Contains(y))
                        || etSearchContent.Text.Split(new String[] { " " }, StringSplitOptions.RemoveEmptyEntries)
                        .Any(y => x.Content.Contains(y)))

在这种情况下,你可以使用 Entity Framework 中的 .AsQueryable() 方法来延迟执行查询条件。这样可以让你在 .Where 之前构建查询条件,然后在 .ToList 之后实际执行查询。

你可以按照以下方式重写查询条件:

var query = dbContext.YourEntity.AsQueryable()
    .Where(x => selectedBookItems.Any(y => y.BookID == x.BookID))
    .Where(x => etSearchTitle.Text.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
        .Any(y => x.Title.Contains(y) || x.PinYin.Contains(y))
        || etSearchContent.Text.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
        .Any(y => x.Content.Contains(y)));

var result = query.ToList();

通过这种方式,你可以在 .Where 之前构建查询条件,然后在需要时执行查询以获取结果。


这样会不会增加内存压力?

使用 .AsQueryable() 方法延迟执行查询条件并不会增加内存压力。实际上,它只是将查询条件延迟到实际需要执行的时候,而不会立即执行查询。

当你调用 .ToList() 方法时,EF Core 会将延迟执行的查询条件转换为 SQL 查询并从数据库中检索数据。因此,如果你的查询条件在 .Where 之前构建而不是在 .ToList 之前,实际上并不会增加内存压力,因为查询仍然会在数据库中执行。

这种方式可以帮助你更灵活地构建复杂的查询条件,同时避免不必要的内存消耗。

posted on   空明流光  阅读(16)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2023-02-18 c++ 11 lamda 如何实现 linq 中 先 where 再 select 的功能
2023-02-18 c++ 有类似 linq 的方便数据处理的技术吗?
2023-02-18 c++ 计算代码中两个点的毫秒差
2019-02-18 c++中函数指针作为int传递
2017-02-18 快速包含删除大量文件的文件夹

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示