动态使用对象初始化器

时间:2016-11-15 14:08:21

标签: asp.net-mvc-5 entity-framework-6 user-defined-types object-initializers

我需要将一个整数列表传递给存储过程,因为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列表并在我的对象初始值设定项中为每条记录创建新对象? 感谢

1 个答案:

答案 0 :(得分:1)

您基本上是在询问如何将List<int>映射(转换)为List<ChartCountryUDT>,在LINQ中称为投影(select):

var procedure = new ChartCountryStoredProcedure()
{
    ChartCountryUDT = activityIDs.Select(id => new ChartCountryUDT { ID = id }).ToList()
};