通过匿名类型在工厂中构建ViewModel

时间:2019-03-18 11:45:05

标签: c# viewmodel

我将数据作为匿名类型传递到我的应用程序,以避免每次选择整个行;刚得到我需要的东西。

由于我无法将GridView绑定到(我知道的)匿名类型,因此我将匿名类型传递给建立ViewModel并返回它的工厂,这样我就有一些要绑定的东西。

在实现工厂之前,我要做的就是将数据选择到新的视图模型中并获取列表:

using (var db = new ApplicationDbContext())
{
    var timesheets = db.Timesheets.Where(x => x.StaffMember.Id == userId && !x.Deleted)
        .Select(x => new { x.Id, x.DateAdded, x.DateCompleted, x.Approved, x.Company.TradingName, x.StartTime, x.EndTime }).ToList();

    return timesheets.Select(x => new TimesheetListViewModel
    {
        Approved = x.Approved,
        CompanyName = x.TradingName,
        DateAdded = x.DateAdded,
        Completed = (x.DateCompleted.HasValue) ? DateTime.Parse(x.DateCompleted.ToString()) : DateTime.MinValue,
        Id = x.Id,
        StaffCanEdit = (x.EndTime == null),
        StartTime = TimeSpan.Parse(x.StartTime.ToString()),
        EndTime = (x.EndTime.HasValue) ? TimeSpan.Parse(x.EndTime.ToString()) : TimeSpan.MinValue
    }).ToList();
}

在这一点上,我想您会同意的,这里所做的解析太多了,无法在服务中使用,因此工厂实现的目的是清除服务中的工作。

我尝试了两种方法:

第一种方法-将属性传递给工厂:

var factory = new TimesheetViewModelsFactory();
using (var db = new ApplicationDbContext())
{
    var timesheets = db.Timesheets.Where(x => x.StaffMember.Id == userId && !x.Deleted)
        .Select(x => new { x.Id, x.DateAdded, x.DateCompleted, x.Approved, x.Company.TradingName, x.StartTime, x.EndTime }).TOList();

    return timesheets.Select(x => factory.GetListViewModel(x.Id, x.DateAdded, x.DateCompleted, x.Approved, x.TradingName, x.StartTime, x.EndTime).ToList();
}

这是一个问题,该函数没有.ToList()方法或这样的方法不可行,然后我想如果我只是通过timesheets怎么办?

第二种方法-将时间表匿名类型传递给工厂:

var factory = new TimesheetViewModelsFactory();
using (var db = new ApplicationDbContext())
{
    var timesheets = db.Timesheets.Where(x => x.StaffMember.Id == userId && !x.Deleted)
        .Select(x => new { x.Id, x.DateAdded, x.DateCompleted, x.Approved, x.Company.TradingName, x.StartTime, x.EndTime }).TOList();

    return factory.GetListViewModel(timesheets);
}

这时,我现在在工厂中通过此调用生成了以下方法:

internal List<TimesheetListViewModel> GetListViewModel(List<object> timesheets)
{
    throw new NotImplementedException();
}

我不知道该如何使用...

我是否只是简单地遍历timesheets中的每个项目并将其转换为时间表对象,然后将其映射到视图模型?

0 个答案:

没有答案