我需要将一个整数列表传递给存储过程,因为Entity Framework需要很长时间来处理请求。我使用用户定义的表类型来执行此操作。我正在使用EntityFrameworkExtras.EF6,并且我已经创建了一个存储过程和Table Type类来帮助解决这个问题。以下是这些课程:
namespace MyModel{
using EntityFrameworkExtras.EF6;
[UserDefinedTableType("SelectedActivity")]
public class ChartCountryUDT
{
[UserDefinedTableTypeColumn(1)]
public int ID { get; set; }
}
[StoredProcedure("GetCountryChartData")]
public class ChartCountryStoredProcedure
{
[StoredProcedureParameter(System.Data.SqlDbType.Udt, ParameterName = "ActivityIDs")]
public List<ChartCountryUDT> ChartCountryUDT { get; set; }
}}
这是我的方法来调用传递Table Type的存储过程并返回一个对象List:
public List<ChartCountry> GetCountriesForChart(List<int> activityIDs)
{
using (MyEntities ctx = new MyEntities())
{
var procedure = new ChartCountryStoredProcedure()
{
ChartCountryUDT = new List<ChartCountryUDT>()
{
new ChartCountryUDT() {ID = 1 }
}
};
return (List<ChartCountry>)ctx.Database.ExecuteStoredProcedure<ChartCountry>(procedure);
}
}
正如您在ChartCountryUDT对象初始化程序中所看到的,我通过将ID值设置为1来硬编码一个对象。这样可以正常工作但我想获取传入的activityIDs参数并创建新对象我的对象初始值设定项,用于activityIDs参数中的每个ID。有没有办法循环我的activityID列表并在我的对象初始值设定项中为每条记录创建新对象? 感谢
答案 0 :(得分:1)
您基本上是在询问如何将List<int>
映射(转换)为List<ChartCountryUDT>
,在LINQ中称为投影(select
):
var procedure = new ChartCountryStoredProcedure()
{
ChartCountryUDT = activityIDs.Select(id => new ChartCountryUDT { ID = id }).ToList()
};