MVC4 DTO 和多对多关系与 WebAPI 的扩展方法
Posted
技术标签:
【中文标题】MVC4 DTO 和多对多关系与 WebAPI 的扩展方法【英文标题】:MVC4 DTO's and Many to Many Relationships with extension methods for WebAPI 【发布时间】:2013-06-17 21:34:55 【问题描述】:在了解 DTO 和扩展方法如何处理 EF5 Code First MVC4 中的多对多关系时,我需要一些帮助。
我有以下 DTO
using System;
using System.Collections.Generic;
namespace Mirtol.Web.Models
public class TaskDetail
public DateTime DueDate get;set;
public int Id get; set;
public string Name get; set;
public string Description get; set;
public string Status get; set;
public string Phase get; set;
public string Project get; set;
public DateTime StartDate get; set;
public string overdue get; set;
public List<GroupDetail> Groups get; set;
using System;
namespace Mirtol.Web.Models
public class GroupDetail
public string GroupName get;set;
public string GroupDescription get; set;
除此之外,我还有以下扩展;
using Mirtol.Web.Models;
using System.Collections;
using System.Collections.Generic;
namespace Mirtol.Web.Extensions
public static class TaskDetailExtensions
public static TaskDetail ToTaskDetail(this Task task)
var success = "success";
var warning = "warning";
var error = "error";
return new TaskDetail
Id = task.Id,
Name = task.Name,
Description = task.Description,
Status = task.Status,
Phase = task.Phase != null ? task.Phase.Name : string.Empty,
Project = task.Project != null ? task.Project.ShortName : string.Empty,
StartDate = task.StartDateTime,
DueDate = task.DueDate,
overdue = task.DueDate > System.DateTime.Now ? success : task.DueDate < System.DateTime.Now.AddDays(-7) ? error : warning,
;
using Mirtol.Entities.Mir;
using Mirtol.Web.Models;
namespace Mirtol.Web.Extensions
public static class GroupDetailExtensions
public static GroupDetail ToGroupDetail(this Group group)
return new GroupDetail
GroupName = group.Name != null ? group.Name: string.Empty,
GroupDescription = group.Description !=null ? group.Description: string.Empty,
;
所以我的任务控制器有一个动作;
public IEnumerable<TaskDetail> GetUserProjectTasks(int id, string ustr, int uid)
var projectUTasks = taskRepository.GetUserProjectTasks(id, ustr, mirtolSecurity.CurrentUserId).Distinct();
return projectUTasks.OrderByDescending(x => x.DueDate).Select(x => x.ToTaskDetail());
返回到TaskDetail。并包括“组”
我在TaskDetailExtension和TaskDetaail中苦苦挣扎,我如何反映一个任务可以属于多个组并且组可以有多个任务的事实? CF 在我的实体类上处理了这个问题,并且关系似乎在那里设置得很好。
我的想法是 Groups = task.Groups(x => x.Groups.ToGroupDetail()),
在TaskDetailExtension中?
任何帮助表示赞赏。
约翰
【问题讨论】:
【参考方案1】:我将假设您的任务有一个名为 Groups 的 IEnumerable。 在这种情况下,您需要两种扩展方法。一个将转换您的子模型,另一个将转换您的子模型列表。
public static GroupDetail ToGroupDetail(this Group group)
return new GroupDetail .. your mappings ;
public static IEnumerable<GroupDetail> ToGroupDetailList(this IEnumerable<Group> groups)
return groups.Select(g => g.ToGroupDetail());
然后在 ToTaskDetail 的其他属性之后包含以下行。
Groups = task.Groups.ToGroupDetailList()
如果 task.Groups 是 IQueriable,您需要更改 ToGroupDetailList 扩展方法以采用 IQueriable 而不是 IEnumerable。希望这会有所帮助
【讨论】:
以上是关于MVC4 DTO 和多对多关系与 WebAPI 的扩展方法的主要内容,如果未能解决你的问题,请参考以下文章