首页 > 解决方案 > 如何将循环迭代结果存储到列表中?

问题描述

我有两个数据库表,一个包含许可证密钥(激活),另一个包含每个许可证密钥的序列号(LicenseSerialNumbers)。LicenseSerialNumbers 表的主键是 Activations 表中 licenseID 列的外键 (LicenseSerialNumbers.ID == Activations.licenseID )

现在,由于业务需求,我已经过滤了 Activations 表结果以​​仅获取针对产品序列号激活的密钥。我在 List 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 参数的 id 是一个列表。但是 SqlQuery 函数只接受原始变量。

如何迭代 id 值并使变量数据成为列表?我尝试了 foreach 和 for 循环来迭代 id 列表,但无法将输出从循环范围中取出。

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”

如何迭代并将每个比较结果添加到列表中?

标签: c#entity-frameworkoopobject

解决方案


如果你想迭代每个 id 第二部分的错误是你没有实例化 temp

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

但是,如果您想一次性完成并在第一部分进行查询

Id = @value

只会接受一个值。

尝试将 long 列表转换为 () 内带有逗号的字符串

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);

推荐阅读