2012-07-10 63 views
-2

我有一個SQL Server Express的2012年實體框架以下事件模型:將實體框架的查詢結果映射到我自己的模型類的最佳方式是什麼?

賽事頁面:ID,名稱,描述.. eventDates:IDEvent,DateStart,DateEnd .. eventTopics:IDEvent IDTopic .. 主題:ID,名稱,說明..

因此,eventDates具有eventPage屬性,eventPage具有IEnumerable,eventTopic具有主題屬性等。

我想對模型進行查詢並將結果映射到C#中的自定義類。 我不想使用由EF生成的模型類,我有一些類只有我需要的屬性。即:

主題: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等,但它太慢了,所以我得到我需要的數據第一次,然後我調用構造函數。

+1

爲什麼你不想使用映射類?你必須有一個非常好的理由讓你的模型編碼兩次...... – ivowiblo 2012-07-10 18:01:42

回答

0

AutoMapper是你在這種情況下的朋友。我建議你閱讀Getting Started guide。理解起來非常簡單,您可以非常快地將查詢映射到您的自定義DTO。

以下是完整的Wiki guide。見Lists and Arrays

在你的情況下,它會是這樣的:

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)); 

這真的很厲害!例如,實體框架默認情況下讓你延遲加載相關實體,所以我認爲上面的例子通過對數據庫的單個查詢開箱即可獲得根對象。

+0

感謝Leniel,我知道AutoMapper並用於更簡單的例子。我的疑問是,我怎麼才能得到我需要的屬性(只有我需要的屬性)和相關的對象,我只需要一個查詢和映射它。我認爲它有點慢,因爲它在初始查詢後對數據庫進行了幾次查詢。希望如此? – 2012-07-10 18:00:34

+1

@ tito.icreativos如果這就是你所擔心的,那麼你可能需要['Include'](http://blogs.msdn.com/b/alexj/archive/2009/06/02/tip-22 -how-make-include-really-include.aspx)'topics'集合。 – 2012-07-10 18:57:03

+0

@ Trustme-I'maDoctor多數民衆贊成在有趣的,我不知道包括。我怎麼能調試最終的SQL執行來檢查什麼是完全檢索,如果它是優化?有沒有辦法追蹤它?我想知道在查詢和映射之後是否有更多的查詢啓動到數據庫。 – 2012-07-11 07:07:30

相關問題