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のパラメーターとしてyour を実行すると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 の作業サンプルのスクリーンショット:

ここに画像の説明を入力

受け入れられた答えが言ったように:

  • たとえば、string.Join を使用して IN 句を構築するストアに対してクエリ文字列を構築し、文字列値のコンマ区切り配列を構築します。
    • ExecuteStoreQuery を使用する場合、SELECT を使用して、データを選択した厳密に型指定されたエンティティに投影することができます - そのプロパティとそれぞれのプロパティの型がデータベースの内容と一致し、Entity Framework が内容を POCO オブジェクトに正常に実体化できる場合に限ります。ジェネリック引数として使用します。
于 2020-03-06T11:28:21.103 に答える