少し問題があります。これについて詳しく説明します。
私のシステムでは、EF4.1で動作する汎用リポジトリがあります。すべてが素晴らしい動作をしますが、特定の状況で問題が発生し、いくつかのクエリに対して動的なorderByを実行する必要があります。
orderByを実行するために、クラスのフィールドを表す「文字列」をパラメーターで受け取ります(「id」や「description」など)。
コードの一部:
public class SomeClass
{
public int id { get; set; }
public string description { get; set; }
}
// First we define the parameter that we are going to use
// in our OrderBy clause. This is the same as "(parameter =>"
// in the example above.
var param = Expression.Parameter(typeof(SomeClass), "parameter");
// Now we'll make our lambda function that returns the
// request.SortingName property by it's name.
var expression = Expression.Lambda<Func<SomeClass, int>>(Expression.Property(param, request.SortingName), param);
このコードは、「request.SortingName」が「int」(id)型の場合は機能しますが、「string」(説明)または別の型でorderByを作成する場合は、このコードは機能しません。
式を「オブジェクト」を使用するように変更しました。
var expression = Expression.Lambda<Func<SomeClass, object>>(Expression.Property(param, request.SortingName), param);
しかし、コードを実行すると、コンパイラは次の例外をスローします。タイプ「System.Int32」の式をリターンタイプ「System.Object」に使用することはできません。
プロパティが文字列型の場合、例外は「System.String」型の式を戻り型「System.Object」に使用できないことです。
つまり、コードは「オブジェクト」タイプでは機能しません。
どうすればこれを理解できるか知っている人はいますか?
御時間ありがとうございます。