如何将循环迭代结果存储到列表中?

时间:2019-06-19 01:40:14

标签: c# entity-framework oop object

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

现在,由于业务需求,我已经过滤了激活表结果,以仅获取针对产品序列号激活的密钥。我在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'

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

2 个答案:

答案 0 :(得分:0)

如果要迭代每个id,第二部分中的错误是您没有实例化temp

import { Pipe, PipeTransform } from "@angular/core";

@Pipe({
  name: "sort"
})
export class ArraySortPipe  implements PipeTransform {
  transform(array: any, field: string): any[] {
    if (!Array.isArray(array)) {
      return;
    }
    array.sort((a: any, b: any) => {
      if (a[field] < b[field]) {
        return -1;
      } else if (a[field] > b[field]) {
        return 1;
      } else {
        return 0;
      }
    });
    return array;
  }
}

但是,如果您想一次使用它,而您的查询在第一部分中

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

仅接受一个值。

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

Id = @value

并将您的sql更改为

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

答案 1 :(得分:0)

在使用temp变量之前,应先对其进行初始化。例如这样的

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

foreach (var i in id) { 
   //...
   temp.Add(a); 
}