2017-02-17 9 views
3

私は分析し、Windowsサービスアプリケーションを作成しています。リストAddRangeを使用して重複値を削除するにはどうすればいいですか? C#

私はInsertクエリを作成するとき、私はList<SqlParameter>とAddRangeを使用して列を追加します。

List<SqlParameter> pmlist = new List<SqlParameter>(keys);行には、{@DeptCode}が含まれています。

次にpmlist.AddRange(pms);行、pmsパラメータが追加されました。私は以前pmslistを述べた

バスはすでに{@DeptCode}を持っているので、この

pmlist = [0] {@DeptCode} [1] {@DeptCode} [2] {@DeptName} 
[3] {@ParentDeptName} [4] {@ParentDeptCode} [5] {@DeptLevel} 

DeptCodeのような値が複製されていpmlist。したがって、ShadowDeptTableにクエリを挿入しようとすると、

また、5つの列があり、SQL例外が発生しました。

重複した値を削除する方法と削除する方法はありますか?助けてください...

コードは以下のとおりです。

//table : ShadowDeptTable , keys = {@DeptCode}, 
//pms = [0] {@DeptCode} [1] {@DeptName} [2] {@ParentDeptName} 
//  [3] {@ParentDeptCode} [4] {@DeptLevel}  

public static int InsertOrUpdate(string table, SqlParameter[] keys, params SqlParameter[] pms) 
{ 
    int st = 0; 
    string constr = Util.GetPropVal(Words.PropConnectionString); 
    var obj = SqlHelper.ExecuteScalar(constr,CommandType.Text,sb.ToString(),keys); 
    StringBuilder sb=new StringBuilder(); 
    sb = sb.Append("insert into " + table + "("); 
    //columns 
    string cols = null; 
    //values 
    string vals = null; 
    List<SqlParameter> pmlist = new List<SqlParameter>(keys); 
    pmlist.AddRange(pms); 
    cols = string.Join(",", pmlist.Select(a => "["+a.ParameterName.Substring(1, a.ParameterName.Length-1)+"]")); 
    vals = string.Join(",", pmlist.Select(a => "'" + a.Value + "'")); 
    sb = sb.Append(cols); 
    sb = sb.Append(") values("); 
    sb = sb.Append(vals); 
    sb = sb.Append(")"); 
    obj = SqlHelper.ExecuteScalar(constr, CommandType.Text, sb.ToString()); 
    return Convert.ToInt32(obj); 
} 

答えて

3

私は多くのコードを掘り下げませんでした。重複を取り除くことだけを話しているとしましょう。

あなたは、パラメータ名で重複を削除したい場合は、多分あなたはこれを試すことができます。

var merged = keys.Union(pms).GroupBy(p => p.ParameterName).Select(e => e.First()); 

それは、パラメータ名で両方の配列、グループをマージし、各グループから最初の項目を選択します。

+0

ありがとうkat1330を使用してみてください。それはうまくいく!本当に役に立つアドバイスです。 :) –

0

Except

List<SqlParameter> newPms = pms.Except(pmlist).ToList(); 
pmlist.AddRange(newPms); 
+0

あなたのアドバイスGSPをありがとう! –

+0

このケースでは、実装された比較器がないとこれが適用されるかどうかはわかりません。 'Except()'はデフォルトの比較関数を使い、 'SqlParameter'は参照型です。オブジェクトに同じ参照がない場合、メソッドは同じ値を保持していても異なるものと見なします。 – kat1330

関連する問題