动态使用对象初始化器

Using Object Initializers dynamically

我需要将整数列表传递给存储过程,因为 Entity Framework 处理请求的时间太长。我正在使用用户定义的 Table 类型来执行此操作。我正在使用 EntityFrameworkExtras.EF6,我已经创建了一个存储过程并 Table 键入 class 来帮助解决这个问题。这是那些 classes:

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 类型并返回对象列表:

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 列表并在我的对象初始值设定项中为每条记录创建新对象? 谢谢

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

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