2

如何将用逗号分隔的整数数组ExecuteStoreCommand作为参数传递给实体中的一个我无法执行此操作:

this.ObjectContext.ExecuteStoreCommand("INSERT INTO SurveyPatientListMrns 
  (UserData, MrnId) SELECT DISTINCT '{0}' , MrnId 
FROM PatientVisits WHERE (FacilityId = {1})
AND (UnitId IN ({2}))", userData, facilityId, (string.Join(",", unitIds)));

(string.Join(",", unitIds))是一个字符串,由于逗号,我无法将其转换为整数。那我该如何传递参数呢?

仅供参考,unitIds 是一个整数数组

4

2 回答 2

5

虽然它看起来像一个string.Format操作,但它ExecuteStoreCommand在内部构建一个参数化查询以提高性能并帮助保护您免受 SQL 注入攻击。(MSDN)

当您将您string.Join作为参数执行时ExecuteStoreCommand,它不会将该结果视为IN子句的值列表,而是恰好看起来像一个字符串。基本上它会生成一个IN如下所示的子句:

(UnitId IN ('1,2,3'))

这显然不是你想要的。

您将不得不在传递它之前使用string.Join-ed 列表构建 SQL 命令:uinitIdsExecuteStoreCommand

string query = @"INSERT INTO SurveyPatientListMrns  (UserData, MrnId) 
    SELECT DISTINCT '{0}' , MrnId 
    FROM PatientVisits WHERE (FacilityId = {1}) AND 
    (UnitId IN (" + string.Join(",", unitIds) + "))";
this.ObjectContext.ExecuteStoreCommand(query, userData, facilityId);

通常应该避免动态构建 SQL 查询,因为可能存在 SQL 注入攻击,但在这种情况下,您知道这unitIds是一个整数列表,因此您应该没问题。

于 2012-11-01T01:06:24.050 回答
0

与答案相同的方法,只是演示使用强类型结果集。

void Main()
{
    int[] operationIds = { 1000, 1001 };
    var result = ObjectContext.ExecuteStoreQuery<EncyptedPatientInfoDataContract>(
                        $@"SELECT OperationId, Name, OfficialId, IsPatientEncrypted FROM Patient WHERE OperationId IN ({string.Join(",", operationIds)})");
                        result.Dump();
}

Dump 方法是 Linqpad 中的一种方法。Linqpad 5 中工作示例的屏幕截图:

在此处输入图像描述

正如公认的答案所说:

  • 针对您构建 IN 子句的商店构建查询字符串,例如使用 string.Join 构建逗号分隔的字符串值数组
    • 使用 ExecuteStoreQuery 时,如果您使用 SELECT 项目,您可以将数据转换为您选择的强类型实体 - 只要其属性和各自的属性类型与数据库内容匹配,以便 Entity Framework 可以成功地将内容具体化到 POCO 对象中您用作通用参数。
于 2020-03-06T11:28:21.103 回答