#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 и получили имена таблиц, имена столбцов и типы столбцов двух таблиц. Нам также необходимо убедиться, что запросы возвращают данные. итак, поставьте точку останова после заполнения двух таблиц, затем наведите указатель мыши на имя таблицы и выберите стрелку вниз и нажмите на визуализатор данных.