-2

Entity Framework に次のイベント モデルを持つ SQL Server Express 2012 があります。

eventPage: ID、名前、説明 .. eventDates: IDEvent、DateStart、DateEnd .. eventTopics: IDEvent IDTopic .. トピック: ID、名前、説明..

したがって、eventDates には eventPage プロパティがあり、eventPage には IEnumerable があり、eventTopic には topic プロパティがあります。

モデルを介してクエリを作成し、その結果を 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 などを取得しましたが、遅すぎたため、最初に必要なデータを取得し、その後コンストラクターを呼び出しました。

4

1 に答える 1

0

そんな時に頼りになるのがオートマッパーです。

入門ガイドを読むことをお勧めします。理解するのは非常に簡単で、クエリからカスタム 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));

本当にパワフルです!たとえば、Entity Framework では、デフォルトで関連するエンティティを遅延ロードできます。したがって、上記の例は、ルート オブジェクトを取得するためのデータベースへの 1 つのクエリですぐに使用できると思います。

于 2012-07-10T17:44:53.027 に答える