2011-02-10 3 views
10

私はEF 4とPOCOを使用する作業単位とリポジトリを持っています。 EFはSkip()とTake()を実行する前に順序付きセットが必要なので、レコードを取り出して動作しているかどうかを確認するために、単体テストを追加しました。「LINQ to Entitiesはエンティティデータモデルのプリミティブ型のみをキャストすることしかサポートしていません」と理解してください。

var myList = UOW.EntityRepo.Get(orderbyLambda: p => p.ID, page: 1, pageSize: 1); 

この結果、orderbyLambda = {p => Convert(p.ID)}の式が得られ、列挙中にエラーが発生します。 IDはtinyint(Int16/short)です

これはなぜIDで注文できないのですか?エラー

Unable to cast the type 'System.Int16' to type 'System.Object'.

についての詳細は、私がExpression<Func<E, object>> orderbyLambda

EDITとしてorderbyLambdaを定義します。私はこれを行う場合

本当のキラーは次のとおりです。

orderbyLambda: p => new { p.ID } 

それは動作します...どうして?

答えて

15

「{オブジェクト}による注文」とパニックが発生しています。 stringintshortDateTimeなどで注文する方法を知っていますが、objectはあまりにも曖昧です。

実際のラムダを正しく入力する必要があります。最も簡単な方法は、すなわち、Getがジェネリックにするために、その後

.... Get<TIdentity>(
     Expression<Func<E, TIdentity>> orderbyLambda, int page, int pageSize) 

と次のようになります。

orderbyLambda: p => p.ID 

(あなたは、呼び出し元のコードを変更せずに)自動的に確認する必要があり、そのジェネリック型を経由して、この場合Get<short>(...)推論。もう1つの選択肢は、<E,object>のままにしておきますが、受信者に式ツリーを書き直すことです。もっと仕事。

+3

orderbyLambda:p => new {p.ID}は働いた...非常に興味深い... –

+5

私はリポジトリAPIのOrderByを作るために同様の問題があった。 OrderByでbalkされたエンティティへのLINQ(e => e.SomeCollection.Count)。式をOrderBy(e => new {e.SomeCollection.Count})に変更することもまた私の仕事でした。 – danludwig

+0

+1上記のolivehourのコメントに、これは私のためにも働いた。 – Beyers