2017-02-17 2 views
3

Я анализирую и создаю приложение для Windows.Как удалить дублирующее значение при использовании списка AddRange? C#

Когда я делаю запрос Insert, я добавляю столбцы, используя List<SqlParameter> и AddRange.

В строке List<SqlParameter> pmlist = new List<SqlParameter>(keys); он содержит {@DeptCode}.

Затем pmlist.AddRange(pms); строка, параметры pms добавлены.

автобуса я упоминал ранее pmslist уже {@DeptCode}, так pmlist имеет значение, как этот

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

DeptCode дублируется. Таким образом, он пытается вставить запрос в 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