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 2024-02-18 17:37  空明流光  阅读(14)  评论(0编辑  收藏  举报

导航