2014-10-07 65 views
1

我想编写一个Linq查询(SQL后端),它通过来自多个列的值集合来限制行。为了说明,一个天真的SQL查询可能是这样的,如果我知道了,前面的所有值:如何编写一个Linq2Sql查询,该查询使用一组组合键或元组来限制行?

SELECT * 
FROM myTable 
WHERE (col1 = val1 AND col2 = val2 AND col2 = val3) 
OR (col1 = val4 AND col2 = val5 AND col2 = val5) 
OR (col1 = val6 AND col2 = val7 AND col2 = val8) 
-- etc... 

如果我在SQL在写这一点,我会考虑使用一个加入反对临时表,表值参数或类似构造。我将如何用Linq2Sql完成此任务?我的值不存储在另一个表中,是从代码和用户输入计算的,并且通常不会预先知道 - 我将它们作为元组的集合接收。

我知道我无法加入内存集合而无需首先将整个表加载到内存中,并且在这些情况下仅限于使用Contains,导致产生WHERE ... IN子句。是否有可能使用这种技术的复合键和元组?

或者,我可以在上面的示例中手动构建WHERE子句的表达式树,模拟WHERE ... OR子句。有没有更好的办法?我怀疑这个SQL语句在条款中有几百个OR语句时效率不高。

回答

-1

如何:

var list = from mT in context.MyTables 
      where (mT.col1 == val1 && mT.col2 == val2 && mT.col3 == val3) 
      || (mT.col4 == val4 && mT.col5 == val5 && mT.col6 == val6) 
      // etc etc 
      select mT; 

...其中val1..val6等是局部变量。这是'naïve'SQL查询的一个非常直接的副本。

+0

感谢您的反馈!对不起,我不清楚我的问题(我会编辑) - 我实际上并不知道所有的值,因为它们作为一个集合传递给一个函数。 – 2014-10-07 17:05:59

+0

你的意思是你在编译时会得到一个类似未知大小的列表?你需要匹配列表的第x个colX? – 2014-10-07 17:26:28

+0

是的,想象这个集合的类型是List >'。现在我需要为列表中的每个元素创建一个谓词,如下所示:'where(mt.Col1 == list [0] .Item1 && mt.Col2 == list [0] .Item2 && mt.Col3 == list [ 0] .Item3)|| (/ *重复列表[i] */...) 我可以创建一个循环,并建立一个表达式树来做到这一点,但我很好奇,如果有一个更简单的方法。 – 2014-10-07 17:43:00