Álv*_*cía 5 c# parameters entity-framework entity-framework-4
我正在使用Entity Framework 4.0,我想使用以下查询:
为此,我执行以下操作:
strSQLQuery = "select * from MyTable where IDData IN (@IDs)";
lstParameters.Clear();
myParameter = new SqlParameter("@IDs", strIDs);
lstParameters.Add(myParameter);
myContext.MyTable.SqlQuery(strSQLQuery, lstParameters.ToArray<object>()).ToList<MyTable>();
Run Code Online (Sandbox Code Playgroud)
但我得到一个例外,说它无法转换nvarchar为bigint.
这是因为参数是类型字符串,表中的ID是bigint.
我尝试创建一个long列表并添加一些ID,但我得到其他错误.
如何在查询中使用列表o ID作为参数?
我想使用参数,如果可能的话.
谢谢.
您的代码存在一些问题.
首先,为了修复您的数据类型错误,您必须strIDs在执行任何其他操作之前转换为整数.这应该工作
var ids = strIDs.Select(s => long.Parse(s));
Run Code Online (Sandbox Code Playgroud)
现在,既然你已经使用了实体框架,为什么不使用Linq而不是创建SQL查询呢?
var results =
from r in myContext.MyTable
where ids.Contains(r.IDData)
select r;
Run Code Online (Sandbox Code Playgroud)
或者用流利的语法
var results = myContext.MyTable.Where(r => strIDs.Contains(r.IDData));
Run Code Online (Sandbox Code Playgroud)
但是如果你真的想使用SQL,那么IN运算符就不支持这样的参数.你必须这样写:
strSQLQuery = "select * from MyTable where IDData IN(@ID1, @ID2, @ID3, ...)";
Run Code Online (Sandbox Code Playgroud)
因此,为了做到这一点而不需要太多努力,您可以ids像这样生成查询:
strSQLQuery = "select * from MyTable where IDData IN(" + String.Join(", ", ids.Select((s, i) => "@ID" + i)) + ")";
foreach(var parameter in ids.Select((s, i) => new SqlParameter("@ID" + i, s)))
{
lstParametros.Add(parameter);
}
Run Code Online (Sandbox Code Playgroud)