我需要使用过滤器列表过滤linq查询,并且我计划使用contains方法来执行此操作。所以它看起来像这样。
List<string> filter = new List<string>();
filter.Add("foo");
filter.Add("bar");
//Additional filters go here, max of about 10 filters
var test = dbcontext.books.Where(x => filter.Contains(x.name)).ToList();
此查询背后的表有很多记录(500,000),PK身份字段和我将要查询的字段的索引。
我的问题是在走这条路线之前您是否希望此查询的性能可以接受,或者我应该在这么大的数据集上使用不同的方法?
答案 0 :(得分:6)
是的,那应该没问题;这只会转化为
select x.* from [books] x where x.name in (@p0,@p1)
@p0 = 'foo'
和@p1 = 'bar'
;只要name
被编入索引就可以了。但是,如果filter
变得非常大,它会变得更有趣。 10项听起来不错。我也隐含地假设它不会返回所有500,000 - 但会限制在一个合理的数字;如果没有,请考虑添加一些.Take(number)
限制。
如果担心,只需测量它。运行SQL跟踪或使用分析工具非常容易。
答案 1 :(得分:0)
如果由于其他原因所有数据已经在内存中,我想你可以使用这种方法。否则,数据库可能会更好,因为您不会一次将500k记录加载到内存中。
select * from Books b where b.name IN {"foo", "bar", ...}