如何使用动态Linq实现tsql“IN”等效

时间:2011-07-26 15:03:35

标签: c# linq linq-to-sql dynamic

我正在创建一个可以接收任何Linq查询的通用表单(C#)。在这种形式中,我希望能够添加过滤器(WHERE子句)。对于像'=','>','赞'等运营商,我可以执行IQueryable.Where(someFieldname + "> @0", someCriteria)之类的操作。但是,当我想能够做相当于T-sql“IN”时,我完全迷失了。我已经搜索了几个小时,但找不到实现它的方法。

当考虑它时,应该可以将IN子句的值放在字符串数组或其他简单的字符串列表中。然后使用基本查询加入此列表。但是,当基本查询可以是任何查询时,如何加入这两个?

实施例: 假设我的基本查询类似于:

IQueryable<Object> q = from a in db.Adresses
                       select new { a.Street, a.HouseNr };

在表单中,我希望能够像这样过滤HouseNr:HouseNr IN(1,3,5) 数字(1,3,5)在字符串数组(或任何其他字符串列表)中可用。

我怎样才能实现这一点,知道基本查询可以是什么?

4 个答案:

答案 0 :(得分:4)

int[] list = new[]{1, 3, 5};
IQueryable<Object> q = from a in db.Adresses
                       where list.Contains(a.HouseNr)
                       select new { a.Street, a.HouseNr };

答案 1 :(得分:2)

Contains在生成SQL时映射到IN

int[] numbers = new int[] { 1, 3, 5 };

var q = from a in db.Addresses
        where numbers.Contains(a.HouseNr)
        select new { a.Street, a.HouseNr }

答案 2 :(得分:0)

这样怎么样......

string[] Numbers = new string[]{"1", "3", "5"};
IQueryable<Object> q = db.Adresses.Where(a => Numbers.Contains(h.HouseNr));

答案 3 :(得分:0)

只是一个想法...... .Intersect()方法不会返回两个值都存在的列表值吗?