System.Linq.Dynamic - 我可以在WHERE语句中使用IN子句

时间:2012-04-17 07:05:53

标签: c# .net linq dynamic

我有动态linq WHERE语句:

dataContext.Table.Where("id = 0 Or id = 1 Or id = 2 Or ...");

我想改变:

dataContext.Table.Where("id IN (0, 1, 2, ...)");

但它不起作用。我怎样才能获得更好的性能呢?

3 个答案:

答案 0 :(得分:10)

来自How to use “contains” or “like” in a dynamic linq query?

//edit: this is probably broken, see below
ids = new int[] {1,2,3,4};
dataContext.Table.Where("id.Contains(@0)", ids);

除此之外:在动态linq表达式中使用占位符是一种好习惯。否则你可能会打开linq注射攻击(Is Injection Possible through Dynamic LINQ?


编辑:

实际上我觉得我搞砸了。 不幸的是,我现在无法测试这一点。 但我认为在这种情况下,正确的语法应该是dataContext.Table.Where("@0.Contains(id)",ids);,而不是相反,并且该版本开箱即用。

有关将此功能添加到动态链接的方法,请参阅here。您需要为此修改库。

答案 1 :(得分:5)

var ids = new int[] {1,2,3,4};
dataContext.Table.Where(f => ids.Contains(f.id))

答案 2 :(得分:4)

似乎在System.Linq.Dynamic的1.0.4版本中,我们可以使用以下语法dataContext.Table.Where("@0.Contains(outerIt.id)",ids);,因为它已经在已经引用的博客中提出并呈现: here