2017-03-08 15 views
5

エンティティの仮想プロパティorderbyは可能ですか?エンティティフレームワークのOrderBy仮想プロパティ

私はに類似したクラスを持っている:

私はもともと部分クラスにメソッドを持っていた

"The specified type member 'TestName' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."

、プロパティ:

public int Id{get;set;} 
public string Name {get;set;} 

public virtual string TestName 
{ 
    get { return string.Format("{0}{1}", Name , Id); } 
} 

私はテスト名プロパティで注文し、私はエラーを取得しますデータの返送には使用されますが、注文には使用されません。

方法はありますか?

+0

私はあなたが読み取り専用またはマップされていないことを指定する必要があると思う。 – Schwarzie2478

+1

エラーはプロパティが 'virtual'とは何の関係もありません。 'OrderBy'を呼び出すコレクションが' IQueryable 'なので、EFは** SQL **を作成しようとしているので、エラーが発生します。 DBはそのプロパティを知らないので、それによって注文することはできません。 –

答えて

3

.OrderBy(x => x.TestName)の代わりに、代わりに.ToList().OrderBy(x => x.TestName)をEFクエリで使用する必要があります。

これは、TestNameプロパティがデータベーステーブルの列として存在せず、クエリをSQLステートメントに変換できないためです。 .ToList()コールは、クエリをC#コレクションにマテリアライズし、次にそれを注文することができます。

+0

これはうまくいくが、私はこのクラスの大規模なコレクションに対して検索クエリを実行しようとしているし、ToList()はパフォーマンスの影響を受けるだろう –

1

DelegateDecompilerを使用して、プロパティ内のコードを式ツリーに展開することができます。これにより、LinqからエンティティへのSQLの生成が可能になります。

https://github.com/hazzik/DelegateDecompiler

あなたは、単に[Computed]属性とプロパティを飾ると、LINQクエリの一部として.Decompile()呼び出す必要があります。

関連する問題