有没有办法可以针对具有指向ArrayList或List的where子句的数据源(可能是sql,oracle或access)创建查询?
示例:
Select * from Table where RecordID in (RecordIDList)
我已经看过Linq的一些方法,但如果可以避免的话,我宁愿不诉诸它。
答案 0 :(得分:12)
您可以使用String.Join
。尝试这样的事情:
String query = "select * from table where RecordId in ({0});";
String formatted = String.Format(query, String.Join(",", list.ToArray()));
作为旁注,这不会保护你免受SQL注入 - 希望这个例子能指出你正确的方向。
答案 1 :(得分:7)
Linq to 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个元素的列表。
答案 2 :(得分:6)
我只是用逗号分隔列表
完成了你想做的事情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)
我很确定你无法实现你所追求的......
答案 3 :(得分:4)
您可以迭代数组并为每个数组添加一个参数。这可以帮助您了解SQL注入,但请确保在构建SQL语句时使用StringBuilder而不是strign concatenation。
e.g。
StringBuilder sql = new StrignBuilder("select * from Table where ");
for (int i = 0; i < RecordIDLis.Length; i++)
{
if (i > 0) sql.Append (" OR ");
sql.Append(" RecordID = @param" + i.ToString() + " ");
IDbDataParameter param = new Param();
param.value etc.
}
答案 4 :(得分:1)
您可以编写一个表值用户定义函数,该函数获取ID列表并创建表,然后再次连接此函数的结果。这个article by Erland Sommarskog描述了如何做到这一点。
或者,您可以使用SQL Server 2008中的新表参数(我认为)。
或者,正如Manu所说,你可以使用XML。
但是,我建议不要在接受的答案中使用IN String.Join方法,因为它就像要求SQL注入一样。
答案 5 :(得分:0)
如果使用动态SQL,则可以将括号内容作为以逗号分隔的文字列表发送。否则,您可以使用XML变量来发送多个值。见http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
答案 6 :(得分:0)
使用Linq to SQL,我假设实体框架,您可以执行以下操作:
dataContext.Table.Where(t => RecordIDList.Contains(t.RecordID));
将同时使用List&lt;&gt;和ArrayList一样,它们都实现了IEnumerable。
Linq和Lambdas要求您反转Contains方法,但它确实有效并生成SQL“IN()”子句。
答案 7 :(得分:0)
您可以使用以逗号分隔的示例字符串列表来执行此操作:
SELECT value
FROM STRING_SPLIT('red,green,blue', ',')
WHERE TRIM(value) <> ''
答案 8 :(得分:-4)
请注意Linq to SQL = dead,来源:http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx
如果要实现此类架构,实体框架是您当前应该使用的。
此外,如果您使用其他选择查询(如GordonB建议)作为“in”子句,最好使用“exists”而不是“in”,例如:
select * from tablename where exists (select id from othertablename where fieldtype=1)