将对象创建到模型中以进行每个查询

时间:2018-07-31 17:09:38

标签: c# .net

我有一个简单的模型,例如:

public class StatisticsModel
{
     public Guid TaskId { get; set; }
     public string Name { get; set; }
     public int Time {get; set; }
}

现在,我想向该模型添加foreach子句的每个寄存器,例如:

 StatisticsModel model = new StatisticsModel();
 foreach(var i in tasks)
 {
     var parameters = ToDataTable(tasks.Select(x => new { i.TaskId, i.Name }).ToList());
     var timeOfTasks = db.ExeSQLParamTable("usp_Get_WorkedProyectTime", parameters, "@ProjectTimeWorkedTableType");
     var test = (from DataRow dr in timeOfTasks.Rows select (int)dr["TaskName"]).FirstOrDefault();

     model.TaskId = i.TaskId;
     model.Name = i.Name;
     model.Time = test
 }

 var final2 = model;

因此,如您所见,我为模型分配了TaskId,名称和时间,但是当foreach完成时,它只会向模型添加最后一个寄存器。如何为模型中的每个task(在我的情况下)创建一个对象?我尝试了类似model.Add()的方法,但是模型中不存在add方法。我究竟做错了什么?问候

5 个答案:

答案 0 :(得分:2)

您已经关闭,您只需要一个型号列表:

List<StatisticsModel> models = new List<StatisticsModel>();
foreach(var i in tasks)
{
    StaticsModel model = new StatisticsModel();

    var parameters = ToDataTable(tasks.Select(x => new { i.TaskId, i.Name }).ToList());
    var timeOfTasks = db.ExeSQLParamTable("usp_Get_WorkedProyectTime", parameters, "@ProjectTimeWorkedTableType");
    var test = (from DataRow dr in timeOfTasks.Rows select (int)dr["TaskName"]).FirstOrDefault();

    model.TaskId = i.TaskId;
    model.Name = i.Name;
    model.Time = test;

    models.Add(model);
}

答案 1 :(得分:2)

您不能将多个属性添加到一件事:为此,您必须具有多个StatisticsModel对象。

例如,您可以使用List<StatisticsModel>

var models = List<StatisticsModel>();
foreach(var i in tasks) {
    StatisticsModel model = new StatisticsModel();
    var parameters = ToDataTable(tasks.Select(x => new { i.TaskId, i.Name }).ToList());
    var timeOfTasks = db.ExeSQLParamTable("usp_Get_WorkedProyectTime", parameters, "@ProjectTimeWorkedTableType");
    var test = (from DataRow dr in timeOfTasks.Rows select (int)dr["TaskName"]).FirstOrDefault();
    model.TaskId = i.TaskId;
    model.Name = i.Name;
    model.Time = test;
    models.Add(model);
}

如果您更喜欢LINQ样式的查询,则可以完全消除循环:

var models = tasks.Select(i => {
    var parameters = ToDataTable(tasks.Select(x => new { i.TaskId, i.Name }).ToList());
    var timeOfTasks = db.ExeSQLParamTable("usp_Get_WorkedProyectTime", parameters, "@ProjectTimeWorkedTableType");
    var test = (from DataRow dr in timeOfTasks.Rows select (int)dr["TaskName"]).FirstOrDefault();
    return new StatisticsModel {
        TaskId = i.TaskId
    ,   Name = i.Name
    ,   Time = test
    };
}).ToList();

答案 2 :(得分:1)

听起来像您顶部需要一个List<StatisticsModel>,这样您就可以在foreach中添加它了:

List<StatisticsModel> models = new List<StatisticsModel>();

foreach(...)
{
    ...
    StatisticsModel model = new StatisticsModel();
    // Assign props
    models.Add(model);
}

甚至更好;由于您实际上只是在转换任务集合,因此只需使用select:

List<StatisticsModel> models = tasks.Select(task => {
   //The foreach contents
   StatisticsModel model = new StatisticsModel();
   // Assign props
   return model;
}).ToList(); //ToList not necessary; eager enumeration is not ideal most of the time but included since you seem to want a list

答案 3 :(得分:0)

foreach循环的每次迭代都会覆盖模型。将其存储在List中:

List<StatisticsModel> allModels = new List<StatisticsModel>();
foreach(var i in tasks)
{
    StatisticsModel model = new StatisticsModel();
    var parameters = ToDataTable(tasks.Select(x => new { i.TaskId, i.Name }).ToList());
    var timeOfTasks = db.ExeSQLParamTable("usp_Get_WorkedProyectTime", parameters, "@ProjectTimeWorkedTableType");
    var test = (from DataRow dr in timeOfTasks.Rows select (int)dr["TaskName"]).FirstOrDefault();

    model.TaskId = i.TaskId;
    model.Name = i.Name;
    model.Time = test
    allModels.Add(model);
 }

 var final2 = allModels;

答案 4 :(得分:0)

您需要创建一个列表(或其他集合)以获取模型列表。这是下面的代码

 List<StatisticsModel> models = new List<StatisticsModel>();
 foreach(var i in tasks)
 {
     var parameters = ToDataTable(tasks.Select(x => new { i.TaskId, i.Name }).ToList());
     var timeOfTasks = db.ExeSQLParamTable("usp_Get_WorkedProyectTime", parameters, "@ProjectTimeWorkedTableType");
     var test = (from DataRow dr in timeOfTasks.Rows select (int)dr["TaskName"]).FirstOrDefault();

     StatisticsModel model = new StatisticsModel();
     model.TaskId = i.TaskId;
     model.Name = i.Name;
     model.Time = test

     models.Add(model);
 }

 var final2 = models; //list of model