在具有多个.Include的LINQ语句时使用AutoMapper

时间:2014-07-22 22:51:32

标签: c# linq automapper

所以我是使用AutoMapper的新手,并且能够使用不使用.Include(" blah")的LINQ语句获得项目的基本映射,但是当我有一个语句时例如像这样;

var courses = dc.Courses.Include("Students")
                        .Include("CourseTimes")
                        .OrderBy(n=>n.CourseSemester.courseStart);

AutoMapper似乎不会从("学生")或(" CourseTimes")中提取任何信息。我的对象发布在下面,并提供快速分类,课程包含学生列表(我需要学生,所以我可以计算每门课程的人数),课程还包含课程时间列表(所以我可以显示时间给定课程的每个班级)。这是我正在使用的ViewModel。

public class UserIndexCourseList
{
    [Key]
    public int courseId { get; set; }
    public string courseCode { get; set; }

    public string courseName { get; set; }

    // this simply stored a count when I did Students.Count without using AutoMapper
    public int size { get; set; } 

    public string room { get; set; }

    public List<CourseTime> courseTimeSlot { get; set; }

}

以下是我尝试使用的一些AutoMapper语句,但没有运气。

//to the viewmodel
        Mapper.CreateMap<Models.Course, ViewModels.UserIndexCourseList>();
        Mapper.CreateMap<Models.CourseTime, ViewModels.UserIndexCourseList>();
        Mapper.CreateMap<Models.Student, ViewModels.UserIndexCourseList>();

//from the viewmodel
        Mapper.CreateMap<ViewModels.UserIndexCourseList, Models.Course>();
        Mapper.CreateMap<ViewModels.UserIndexCourseList, Models.CourseTime>();
        Mapper.CreateMap<ViewModels.UserIndexCourseList, Models.Student>();

所以基本上我如何创建一个Map,它也会提取所有这些信息,以便我可以将它与我上面发布的ViewModel一起使用?我尝试了很多选择,但没有运气。

我为提前作出的类似帖子道歉,但我不认为我第一次解释得很好。再次感谢!

1 个答案:

答案 0 :(得分:1)

按照惯例,automapper映射具有相同名称的属性,因此在您的情况下,您可以执行此操作:

public class UserIndexCourseList
{
    ...
    //rename field so it has same name as reference
    public List<CourseTime> CourseTimes{ get; set; }  
}

或者您可以在EF中重命名引用,因此它的名称是courseTimeslot。

如果您不想重命名您的媒体资源,另一种解决方案是添加地图选项,例如:

Mapper.CreateMap<Models.Course, ViewModels.UserIndexCourseList>()
.ForMember(d => d.courseTimeSlot,
    opt => opt.MapFrom(src => src.CourseTime));

编辑:他们也有很好的文档,您的案例在此处描述:https://github.com/AutoMapper/AutoMapper/wiki/Projection

&#34;因为目标属性的名称与源属性不完全匹配(CalendarEvent.Date需要是CalendarEventForm.EventDate),我们需要在类型映射配置中指定自定义成员映射。 &#34;