有没有一种方法可以针对具有指向 ArrayList 或 List 的 where 子句的数据源(可以是 sql、oracle 或 access)创建查询?
示例:
Select * from Table where RecordID in (RecordIDList)
我已经看到了一些使用 Linq 实现此目的的方法,但如果可以避免的话,我宁愿不使用它。
我只做了你试图用逗号分隔列表做的事情
Select * from Table where RecordID in (1,2,34,45,76,34,457,34)
或者结果来自单独的选择
Select * from Table where RecordID in (select recordId from otherTable where afieldtype=1)
我很确定你无法实现你所追求的......
您可以使用
String.Join
。尝试这样的事情:
String query = "select * from table where RecordId in ({0});";
String formatted = String.Format(query, String.Join(",", list.ToArray()));
顺便说明一下,这不会保护您免受 SQL 注入 - 希望这个示例能为您指明正确的方向。
Linq 到 Sql。 RecordList 应该是
List<T>
,而不是 ArrayList
或 IList<T>
IEnumerable<TableRow> query =
from t in db.Table
where RecordList.Any(r => t.RecordId == r)
select t;
这将生成带有参数的sql:
SELECT *
FROM Table
WHERE RecordId in (@p0, @p1, @p2, @p3, @p4)
Linq 将生成所需数量的参数。某些数据库实现在可接受的参数数量方面受到限制。 SqlServer2005 的限制是略多于 2000 个参数...所以不要使用包含超过 2000 个元素的列表。
您可以迭代数组并为每个数组添加一个参数到 SQL。这可以帮助您解决 SQL 注入问题,但请确保在构建 SQL 语句时使用 StringBuilder 而不是字符串连接。
例如
StringBuilder sql = new StringBuilder("select * from Table where ");
for (int i = 0; i < RecordIDList.Length; i++)
{
if (i > 0) sql.Append (" OR ");
sql.Append(" RecordID = @param" + i.ToString() + " ");
IDbDataParameter param = new Param();
param.value etc.
}
您可以编写一个表值用户定义函数,该函数采用 ID 列表并创建一个表,然后再次连接该函数的结果。 Erland Sommarskog 的这篇文章描述了如何做到这一点。
或者,您可以使用 SQL Server 2008 中新增的表参数(我认为)。或者,正如 Manu 所说,您可以使用 XML。
但是,我建议不要在接受的答案中使用 IN String.Join 方法,因为这就像要求 SQL 注入。
dataContext.Table.Where(t => RecordIDList.Contains(t.RecordID));
可与 List<> 和 ArrayList 一起使用,因为它们都实现 IEnumerable。
Linq 和 Lambdas 要求您反转 Contains 方法,但它确实有效并生成 SQL“IN ()”子句。
SELECT value
FROM STRING_SPLIT('red,green,blue', ',')
WHERE TRIM(value) <> ''