7

我正在使用 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>();

但我得到一个例外,说它不可能转换nvarcharbigint.

那是因为参数是类型字符串,而表中的ID是bigint

我尝试创建一个长列表并添加一些 ID,但出现其他错误。

如何在查询中使用 ID 列表作为参数?

如果可能的话,我想使用参数。

谢谢。

4

1 回答 1

11

您的代码存在一些问题。

首先,要修复您的数据类型错误,您必须strIDs在执行其他任何操作之前转换为整数。这应该工作

var ids = strIDs.Select(s => long.Parse(s));

现在,既然您已经在使用实体框架,为什么不使用 Linq 而不是创建 SQL 查询呢?

var results =
    from r in myContext.MyTable
    where ids.Contains(r.IDData)
    select r;

或流利的语法

var results = myContext.MyTable.Where(r => strIDs.Contains(r.IDData));

但是如果你真的要使用SQL,IN操作符是不支持这样的参数的。你必须这样写:

strSQLQuery = "select * from MyTable where IDData IN(@ID1, @ID2, @ID3, ...)";

因此,要做到这一点而无需太多努力,您可以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);
}
于 2013-04-18T14:40:59.033 回答