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 之前,实际上并不会增加内存压力,因为查询仍然会在数据库中执行。
这种方式可以帮助你更灵活地构建复杂的查询条件,同时避免不必要的内存消耗。
桂棹兮兰桨,击空明兮溯流光。