如何使用动态Linq实现tsql中的“IN”等效功能

5
我正在创建一个通用表单(C#),可以接收任何 Linq 查询。在这个表单中,我想能够添加过滤器(WHERE 子句)。对于像“=”,“>”,“Like”等操作符,我可以像 IQueryable.Where(someFieldname + "> @0", someCriteria) 这样做。但是,当我想要使用 T-sql 中的“IN”相等时,我完全迷失了方向。我搜索了很多小时,但找不到实现它的方法。
考虑到这一点,应该有可能将 IN 子句的值放入字符串数组或其他简单的字符串列表中。然后将此列表与基本查询连接起来。但是,当基本查询可以是任何查询时,如何连接这两个呢?
例如: 假设我的基本查询是:
IQueryable<Object> q = from a in db.Adresses
                       select new { a.Street, a.HouseNr };

在表单中,我希望能够按照以下方式过滤HouseNr:Where HouseNr IN (1, 3, 5) 数字(1、3、5)可用于字符串数组(或任何其他字符串列表)。
知道基本查询可以是任何内容,我该如何实现这一点?

我认为没有一个人理解你的问题。你可以使用动态 Linq 生成一个 OR 语句列表,但这并不完全等同于 IN 子句。 - Peter Majeed
4个回答

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 };

当您拥有名为“地址”的对象时,这确实有效,但我拥有的是可以是任何内容的查询。我需要一种动态解决方案,而不是在其中硬编码引用Linq对象的解决方案。 - Roland Deschain
@Stefan,你仍然可以以相同的方式在动态查询结果上使用Contains()。 - Bala R
1
你能给我一个例子吗?我似乎无法正确地理解它。 - Roland Deschain
1
你能给我一个关于这个的例子吗?谢谢你的时间。 - Roland Deschain

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 }

1
不幸的是,这并不是我的问题的解决方案。我使用地址作为示例。将地址替换为任何IQueryable对象:你的解决方案会是什么? - Roland Deschain

0

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


0

这样怎么样...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接