Linq的表现包含

时间:2012-01-20 21:49:45

标签: c# linq linq-to-sql

我需要使用过滤器列表过滤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身份字段和我将要查询的字段的索引。

我的问题是在走这条路线之前您是否希望此查询的性能可以接受,或者我应该在这么大的数据集上使用不同的方法?

2 个答案:

答案 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", ...}