«Последовательность не содержит соответствующего элемента» я получаю эту ошибку при выполнении кода Linq

#c# #asp.net #linq

#c# #asp.net #linq

Вопрос:

Я получаю «Последовательность не содержит соответствующего элемента» при попытке сравнить и назначить некоторые данные с помощью запроса LINQ

 cfgData.Rows.Cast<DataRow>().ToList().
  ForEach(row => row["Name"] =
            valData.Rows.Cast<DataRow>().
              First(x => Convert.ToInt32(row["AccountTypeId"]).
                           Equals(Convert.ToInt32(x["Id"])))["AccountType"]);
  

В контексте:

 public static object DeployAccountTypes()
{
  using (SqlConnection cfgConn = Connection.GetConnection(NamedConnection.Configuration))
  using (SqlConnection valConn = Connection.GetConnection(NamedConnection.Validation))
  using (SqlCommand cmd = new SqlCommand("SELECT *, '' as Name FROM tcRAPIDAccountTypes (NOLOCK) ORDER BY EvaluationOrder", cfgConn))
  using (SqlCommand cmd1 = new SqlCommand("SELECT * FROM tcRAPIDLoadAccountTypes (NOLOCK)", valConn))
  {
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable cfgData = new DataTable();
    da.Fill(cfgData);

    da = new SqlDataAdapter(cmd1);
    DataTable valData = new DataTable();
    da.Fill(valData);

    // ERROR HERE
    cfgData.Rows.Cast<DataRow>().ToList().
      ForEach(row => row["Name"] =
                valData.Rows.Cast<DataRow>().
                  First(x => Convert.ToInt32(row["AccountTypeId"]).
                               Equals(Convert.ToInt32(x["Id"])))["AccountType"]);
  

Данные из SELECT * FROM tcRAPIDLoadAccountTypes (NOLOCK) :

 Id  AccountType AccountTypeDescription  LOB
1   ABDNPROP    NULL                    AP
2   ASR         NULL                    CAS
4   BBUS        NULL                    CAS
5   BRETL       NULL                    CAS
6   BUSFLPOA    NULL                    CAS
7   BVICMN      NULL                    CAS
8   CORP        NULL                    CAS
9   CPSACCT     NULL                    CPS
10  DEFAULT     NULL                    CODG
  

Данные из SELECT *, '' as Name FROM MLSNAPS_XTCMConfig.dbo.tcRAPIDAccountTypes (NOLOCK) ORDER BY EvaluationOrder :

 Id  AccountTypeId   Description IsActive
6   45              NULL        1
7   46              NULL        1
8   16              NULL        1
9   23              NULL        1
10  22              NULL        1
11  49              NULL        1
12  20              NULL        1
13  18              NULL        1
14  17              NULL        1
15  15              NULL        1
  

Комментарии:

1. Вы проверяли, не являются ли cfgData и valData пустыми?

2. да, у меня есть проверка.

3. я нашел основную причину, то есть: данные в преобразовании. ToInt32 (строка [«AccountTypeId»] и преобразовать. ToInt32 (x[«Id»] не совпадают, поэтому я сталкиваюсь с этой проблемой. я также пытался использовать FirstOrDefault, но он возвращает нулевое значение (как и ожидалось) и выдает другую ошибку (объект не установлен в экземпляр объекта)

Ответ №1:

Попробуйте объединить :

 public static object DeployAccountTypes()
{
  using (SqlConnection cfgConn = Connection.GetConnection(NamedConnection.Configuration))
  using (SqlConnection valConn = Connection.GetConnection(NamedConnection.Validation))
  using (SqlCommand cmd = new SqlCommand("SELECT *, '' as Name FROM tcRAPIDAccountTypes (NOLOCK) ORDER BY EvaluationOrder", cfgConn))
  using (SqlCommand cmd1 = new SqlCommand("SELECT * FROM tcRAPIDLoadAccountTypes (NOLOCK)", valConn))
  {
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable cfgData = new DataTable();
    da.Fill(cfgData);

    da = new SqlDataAdapter(cmd1);
    DataTable valData = new DataTable();
    da.Fill(valData);

    var results = (from cfg in cfgData.AsEnumerable()
        join val in valData.AsEnumerable() on cfg.Field<int>("AccountTypeId") equals val.Field<int>("Id")
        select new { cfg = cfg, val = val })
        .ToList();
  }

}
  

Комментарии:

1. не могли бы вы, пожалуйста, изменить код » cfgData.Rows.Cast<DataRow> (). ToList().ForEach(строка => row[«Name»] = valData.Rows.Cast<DataRow>().First(x => Преобразовать. ToInt32(строка [«AccountTypeId»]).Равно (преобразовать. ToInt32(x [«Id»])))[«AccountType»]);» с запросом объединения.

2. Почему First()? Зачем перечислять с помощью ForEach()? Похоже, вы хотите создать GROUPBY, а затем получить первый элемент в группе.

3. это код, написанный другим разработчиком несколько лет назад. у меня нет никакого опыта в linq, поэтому я не уверен, что этот код сделал. это работало в предыдущей версии, но теперь я изменил некоторые DLL, которые не имеют никакой зависимости от этого кода, и это перестает работать.

4. я также попытался с измененным запросом «ВЫБРАТЬ rlat.* ИЗ tcRAPIDLoadAccountTypes rlat (NOLOCK) внутреннего соединения MLSNAPS_XTCMConfig.dbo.tcRAPIDAccountTypes (nolock) rat на rlat.id = rat. Accounttypeid», чтобы получить аналогичные данные, но все еще с той же проблемой.

5. Мне нужно, чтобы вы использовали SQL Server Management Studio и получили имена таблиц, имена столбцов и типы столбцов двух таблиц. Нам также необходимо убедиться, что запросы возвращают данные. итак, поставьте точку останова после заполнения двух таблиц, затем наведите указатель мыши на имя таблицы и выберите стрелку вниз и нажмите на визуализатор данных.