2009-08-13 10 views
1

ID(GUID)とCreatedAt(DateTime)を含む複合キーを持つエンティティを持つエンティティセットがあります。このCreatedAtは、エンティティが作成されたときです。各レコードは、複数のレコードが同じIDを持つことができるように各エンティティの各バージョンを表します。最新のIQueryableを作成するEntity Framework

リクエストされたエンティティの最新バージョンのみを返すように再利用できるIQueryableを返すメソッドを作成したいが、答えを見つけるのに苦労している(実際には回答)。

は私が

(from e in context.Entities where e.ID = myID orderby e.CreatedAt).FirstOrDefault(); 

ようなクエリを書くことができることを知っている。しかし、私が代わりにこれを行うことができるようにしたい:それは唯一の最新バージョンを返します

(from e in context.GetCurrentEntities() where e.ID = myID).FirstOrDefault(); 

このようなことエンティティが必要です。

これは実行可能ですか?

ご協力いただきありがとうございます。

リー

+0

dahlbykとCraig Stuntzは、あなたがしようとしていることについて正しい答えをあなたに与えました。 +1人。私は、コンパイルされたクエリがパフォーマンスの面でよりうまくいくかどうかを見ています。また、私は文脈にIMOを与えてはならないという機能性を提供するコンテキストクラスに責任を負うため、RPを推奨しました。 – Perpetualcoder

答えて

2

IDによって、あなたのグループならば、あなたはこのようなものを使用して、各グループからの唯一の最も最近のを選択することができます。

public IQueryable<Entity> GetCurrentEntities() 
{ 
    return from e in this.Entities 
      group e by e.ID into g 
      select g.OrderByDescending(e => e.CreatedAt).First(); 
} 

少なくともありますしない限り、グループが作成されませんので、あなたがFirstOrDefault()を必要としませんグループ内の1つはEntityです。

+0

ありがとう - 私はそれを行く –

0

あなたは小さな画像を見ていると思います。リポジトリパターンの実装を検討しましたか? LINKそれ以外の場合は、このGetCurrentEntitiesメソッドをコンテキストクラスに追加する必要があります。

+0

こんにちはPerpetualcoder アドバイスをいただきありがとうございます。私たちは、現在のプロジェクトでEFを続ける方法を見て、多くの時間を費やしました。私はEFがあまりにも多くを取得することがわかりました。オプション(他のORM、手書きDAL)を見た後、私たちはEFで支配し、それを '型安全な' SQLとして使用し、他のすべての機能を避けます。 Repostiory Patternにはどのような利点がありますか? 私の意図は、DataContextにGetCurrentEntities()を追加することです。 –

+0

リポジトリ・パターンは、コントローラを単体テストするときに模擬リポジトリのEFをスワップアウトするのが簡単です。 –

2

方法について:

public partial class MyEntities // or whatever you call your ObjectContext 
{ 
    public IQueryable<Entity> GetCurrentEntities() 
    { 
     return from e in context.Entities 
       group e by e.ID into g 
       from ge in g 
       orderby ge.CreatedAt desc 
       select ge.First(); 
    } 
} 

これは私の頭の上からですが、それはあなたが始める必要があります。

+0

ありがとうございます - これはdahlbykのソリューションと同等ですか、それとも別の結果がありますか? –

+1

これは同等です。 – dahlbyk

+0

偉大な - もう一度感謝! –

関連する問題