-2

我在实体框架中有一个带有以下事件模型的 SQL Server Express 2012:

eventPage:ID、名称、描述 .. eventDates:IDEvent、DateStart、DateEnd .. eventTopics:IDEvent IDTopic ..主题:ID、名称、描述..

所以 eventDates 有一个 eventPage 属性, eventPage 有一个 IEnumerable 并且 eventTopic 有一个 topic 属性等等。

我想通过模型进行查询,结果将其映射到我在 C# 中的自定义类。我不想使用 EF 生成的模型类,我有一些具有我需要的唯一属性的类。IE:

主题:ID、名称 EventDate:DateStart、DateEnd 事件:ID、名称、主题、开始、结束

成为主题是主题列表,日期是 EventDates 列表

我有一个方法可以进行查询并返回一个 IQueryable 并从中我想要一个列表。

所以我得到它的方式是:

var events=GetEvents(start, end);
var eventsList = (from ev in events
                  select new {event = ev, eventPage = ev.eventPage,topics=ev.eventTopics)).ToList();
//Mapping
var map = (from ev in eventsList
select new Event(ev.event,ev.eventPage,ev.topics)).ToList();

在构造函数中我设置了属性:

this.name=eventPage.Name;
this.start=event.Start;
this.end=event.End;
this.topics = topics.Select(t=>t.Topic).ToList();

但这对于大量事件来说有点慢,我想知道是否有更优化的方式。

一开始,构造函数唯一的参数是事件,在里面我得到了 event.eventPage.Name 等,但它太慢了,所以我先得到我需要的数据,然后我调用构造函数。

4

1 回答 1

0

在这种情况下, AutoMapper是您的朋友。

我建议您阅读入门指南。这很容易理解,您将能够非常快速地将查询映射到您的自定义 DTO。

这是完整的Wiki 指南。请参阅列表和数组

在你的情况下,它会是这样的:

Mapper.CreateMap<Event, MyCustomEvent>();

var events =
    Mapper.Map<IEnumerable<Event>, IEnumerable<MyCustomEvent>>(Database.Events).
    AsQueryable();

AutoMapper还允许您执行以下操作:

Mapper.CreateMap<Event, MyCustomEvent>().
ForMember(dest => dest.SomeCollectionProperty, opt => opt.MapFrom(src => src.RelationshipProperty.SomeCollectionProperty));

它真的很强大!例如,实体框架默认情况下让您延迟加载相关实体,因此我认为上面的示例开箱即用,只需对数据库进行一次查询即可获取根对象。

于 2012-07-10T17:44:53.027 回答