【问题标题】:Best approach for view model creation to handle single entity and list - return IQuerable创建视图模型以处理单个实体和列表的最佳方法 - 返回 IQueryable
【发布时间】:2014-10-15 01:54:33
【问题描述】:

寻找最佳方法/模式的输入,以满足视图模型类的以下要求:

  • 将 IQueryable 从存储库选择转换为 IQueryable 视图模型查询
  • 将 db 实体的单个实例转换为视图模型实例
  • 两者都使用单一方法将 db 实体映射到视图模型属性以避免映射复制

我正在尝试的示例,但它无法正常工作......而且似乎有点破解:

public class WorkOrderDependencyViewModel : IEntity, IViewModel<WorkOrderDependency, WorkOrderDependencyViewModel>
{
    public int Id { get; set; } }
    public int WorkOrderHeaderId { get; set; }
    public int POHeaderId { get; set; }      
    public decimal RemainQty { get; set; }

    //Re-use this mapping logic for both converting a query and converting a single db entity instance. Used by Kendo Grids
    public IQueryable<WorkOrderDependencyViewModel> ConvertClassQueryToViewModelQuery(IQueryable<WorkOrderDependency> entityQuery)
    {
        var viewModelResultQuery = entityQuery
            .Select(x => new WorkOrderDependencyViewModel()
            {
                Id = x.Id,
                WorkOrderHeaderId = x.WorkOrderHeaderId,
                POHeaderId = x.PODetail.POHeaderId,
                RemainQty = x.PODetail.QtyOrdered - x.PODetail.QtyReceived
            }
        );

        return viewModelResultQuery;
    }

    //convert single instance of db entity to view model, but use existing mapping logic from above method
    public WorkOrderDependencyViewModel ConvertClassToViewModel(WorkOrderDependency entity)
    {
        var entityList = new List<WorkOrderDependency>();
        entityList.Add(entity);
        var viewModel = ConvertClassQueryToViewModelQuery(entityList.AsQueryable()).FirstOrDefault() as WorkOrderDependencyViewModel;
        return viewModel; <------ viewModel is NULL
    }
}

为什么 viewModel 返回 NULL?

【问题讨论】:

  • 你的代码有错别字吗?您将实体投影到 WorkOrderDependencyListViewModel 而不是 WorkOrderDependencyViewModel
  • 是的,谢谢,但这只是我在问题中粘贴信息时的拼写错误,而不是在真正的源代码中,所以这不是问题的根源。
  • 我可能会放置一个断点并找出该行的哪一部分为空。例如实体为空,您的 ConvertClassQueryToViewModelQuery() 是否返回空?还要检查调用 FirstOrDefault() 是否为您提供了正确的类型。如果转换为 WorkOrderDependencyViewModel 失败,它将返回 null
  • @ChadRichardson - 你看过 AutoMapper 吗?我将它用于 Entity -> ViewModel 转换,反之亦然。 automapper.org

标签: c# asp.net-mvc entity-framework linq-to-entities


【解决方案1】:

如果您不需要 IQueryable,这将是一种更短、更简单的方法

public WorkOrderDependencyViewModel ConvertClassToViewModel(
    WorkOrderDependency entity)
{
    return new WorkOrderDependencyViewModel 
    {
        Id = entity.Id,
        WorkOrderHeaderId = entity.WorkOrderHeaderId,
        POHeaderId = entity.PODetail.POHeaderId,
        RemainQty = entity.PODetail.QtyOrdered - entity.PODetail.QtyReceived
    };
}

编辑 如果您将其用作 linq 查询的一部分,也许您可​​以使用 Automapper 或类似这样的函数

private static readonly Expression<Func<WorkOrderDependency, WorkOrderDependencyViewModel>> AsViewModel =
    entity => new WorkOrderDependencyViewModel
        {
            Id = entity.Id,
            WorkOrderHeaderId = entity.WorkOrderHeaderId,
            POHeaderId = entity.PODetail.POHeaderId,
            RemainQty = entity.PODetail.QtyOrdered - entity.PODetail.QtyReceived
        };

您可以像这样在查询中使用它

public IQueryable<WorkOrderDependencyViewModel> GetViewModel()
{
    return repository.WorkOrderDependencies  // change to suit your query needs
                     .Select(AsViewModel);

}

【讨论】:

  • 是的,但我确实需要 IQueryable,因为这是我要传递回 Kendo Grid 的内容,并且使用 IQueryable,它会根据用户在网格上的操作(如排序和过滤)进一步自动操作查询。
  • @ChadRichardson 你能看到我对 linq 查询所做的编辑吗?
  • 好的,我现在正在为 IQueryable 尝试这个......但是你如何使用这个函数来转换实体的单个实例? - 对不起,如果这很明显,但我是函数新手。
  • 我想你可以做你上面所做的并将实体添加到列表中,然后调用 return yourlist.Select(AsViewModel);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多