Как сохранить результаты итерации цикла в списке? - PullRequest
1 голос
/ 19 июня 2019

У меня есть две таблицы БД, одна из которых содержит лицензионные ключи (Активации), а другая - серийный номер каждого лицензионного ключа (LicenseSerialNumbers).Первичный ключ таблицы LicenseSerialNumbers - это внешний ключ столбца licenseID в таблице активаций (LicenseSerialNumbers.ID == Activations.licenseID)

Теперь я отфильтровал результат таблицы активаций, чтобы получить только ключи, активированные для серийного номера продукта.из-за требований бизнеса.У меня есть этот результат в список currentKey

var currentKey = context.Activations.SqlQuery("SELECT * FROM Activations where JSON_VALUE(ActivationInfo, '$.SerialNumber')=@value", new SqlParameter("@value", activationinfo)).ToList();

Я создал ViewModel для обеих моделей для объединения результатов таблицы

public class LicenseSerialNumberViewModel
{ 
public List<Activation> Activations { get; set; }
public List<LicenseSerialNumber> LicenseSerialNumber { get; set; }
}

Присоединение к списку:

var data = new LicenseSerialNumberViewModel();
var result = data.LicenseSerialNumber.Join(data.Activations, l => l.Id, a 
=> a.licenseID, (LId, serial) => new{LId = LId.SerialNumber});

Я ожидаю опубликовать значения обеих таблиц в одном представлении.Отфильтрованные строки таблицы активаций должны сравниваться с таблицей / классом LicenseSerialNumber и передаваться в представление.

Проблема: я не получаю ожидаемый результат.Я новичок в программировании. Я достиг прогресса до этого момента и застрял в том месте, где функция SqlQuery может принимать только переменные примитивного типа.Но результат currentkey - это список.

var currentKey = context.Activations.SqlQuery("SELECT * FROM Activations where JSON_VALUE(ActivationInfo, '$.SerialNumber')=@value", new SqlParameter("@value", activationinfo)).ToList(); var id = currentKey.Select(a => a.LicenseSerialNumberId).ToList(); 

var data = context.LicenseSerialNumbers .SqlQuery("Select * from LicenseSerialNumbers where Id =@value", new SqlParameter("@value", id)).ToList();

В приведенном выше коде идентификатор, который я передал параметру @value, представляет собой список.Но функция SqlQuery принимает только примитивные переменные.

Как я могу перебрать значения id и сделать данные переменных списком?Я пробовал цикл foreach и for для перебора списка идентификаторов, но не смог получить вывод из области цикла.

List<long> temp; 

foreach (var i in id) { 

var a = context.LicenseSerialNumbers.SqlQuery("Select * from LicenseSerialNumbers where Id =@value", new SqlParameter("@value", i)).Single();
temp.Add(a); 
} 

Ошибка: использование неназначенной локальной переменной 'temp'

Как выполнить итерацию и получить каждый сравниваемый результат, добавленный в список?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Вы должны инициализировать переменную temp, прежде чем захотите ее использовать.например, вот так:

List<long> temp = new List<long>(); //<==== HERE

foreach (var i in id) { 
   //...
   temp.Add(a); 
} 
0 голосов
/ 19 июня 2019

Если вы хотите повторить каждый идентификатор, то ошибка во второй части заключается в том, что вы не создали экземпляр temp

List<long> temp = new List<long>();

Но если вы хотите получить его за один раз, а ваш запрос - в первой части

Id = @value

примет только одно значение.

Попробуйте преобразовать список long в строку с запятой внутри a ()

List<long> list = new List<long>() {1,2,3}; //list of ids
string convertedListOfLong = string.Join(", ", list);

И изменив свой sql на

string.Format("Select * from LicenseSerialNumbers where Id IN ({0})", convertedListOfLong);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...