【发布时间】:2014-12-02 03:57:11
【问题描述】:
我想编写一个 Linq 查询(SQL 后端),它通过来自多个列的值的集合来限制行。为了说明,如果我预先知道所有值,那么一个简单的 SQL 查询可能看起来像这样:
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 子句。有没有更好的办法?我怀疑当子句中有数百条OR语句时,这样的SQL语句效率不会很高。
【问题讨论】:
标签: sql sql-server linq expression-trees composite-key