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
语句时效率不高。
感谢您的反馈!对不起,我不清楚我的问题(我会编辑) - 我实际上并不知道所有的值,因为它们作为一个集合传递给一个函数。 – 2014-10-07 17:05:59
你的意思是你在编译时会得到一个类似未知大小的列表?你需要匹配列表的第x个colX? –
2014-10-07 17:26:28
是的,想象这个集合的类型是List>'。现在我需要为列表中的每个元素创建一个谓词,如下所示:'where(mt.Col1 == list [0] .Item1 && mt.Col2 == list [0] .Item2 && mt.Col3 == list [ 0] .Item3)|| (/ *重复列表[i] */...) 我可以创建一个循环,并建立一个表达式树来做到这一点,但我很好奇,如果有一个更简单的方法。 –
2014-10-07 17:43:00