2011-07-26 52 views
5

我正在創建一個可以接收任何Linq查詢的通用表單(C#)。在這種形式下,我希望能夠添加過濾器(WHERE子句)。對於'=','>','Like'等運營商,我可以做類似IQueryable.Where(someFieldname + "> @0", someCriteria)的事情。但是當我想要做一個T-sql的「IN」時,我完全失去了。我查了幾個小時,但找不到實現它的方法。如何使用動態Linq實現tsql「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)可用於字符串數組(或任何其他字符串列表)。

我該如何做到這一點,知道基本查詢可以是任何東西?

+0

我不認爲一個人理解你的問題。您可以使用Dynamic Linq來生成'OR'語句的列表,但這不完全與'IN'子句相同。 –

回答

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

這確實有效,當你有一個名爲Adresses的對象時,但我擁有的是可以是任何東西的查詢。我需要一個動態解決方案,而不是我硬編碼引用Linq對象的解決方案。 –

+0

@Stefan您仍然可以以相同的方式在動態查詢結果上使用Contains()。 –

+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 } 
+1

不幸的是,這不是我的問題的解決方案。我以地址爲例。用任何IQueryable對象替換Adresses:你的解決方案是什麼? –

0

這個怎麼樣...

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

只是一個想法......在哪裏都存在價值並不在.Intersect()方法返回一個列表的值是多少?