partial class
いくつかの派生プロパティを持つように構文を使用して拡張した Entity クラスがあります。これらのフィールドからの情報を使用するインターフェイスを使用してクエリを実行したいのですがIQueryable<T>
、現在、次のような例外が発生します。
指定された型メンバー 'Title' は、LINQ to Entities ではサポートされていません。初期化子、エンティティ メンバー、およびエンティティ ナビゲーション プロパティのみがサポートされています。
関連するコード スニペットを次に示します。Entity オブジェクトには という名前の String メンバーがあると想定できますId
。
public partial class MyEntityObject
{
public String Title { get { return MyStrings.ResourceManager.GetString(Id) ?? ""; } }
}
/**
* Throws exception trying to sort on the 'Title' field of a 'MyEntityObject'
*/
public IEnumerable<T> Query<T>(String fieldName, int low, int high)
{
// Get the ObjectContext<T> using a Repository pattern
var query = context.GetRepository<T>()
// Create an OrderBy clause based on the field by dynamically building an expression tree
// see http://stackoverflow.com/questions/4546463/help-with-linq-and-generics-using-getvalue-inside-a-query
PropertyInfo propertyInfo = typeof(T).GetProperty(fieldName);
ParameterExpression e = Expression.Parameter(typeof(T), "e");
MemberExpression mexpr = Expression.MakeMemberAccess(e, propertyInfo);
IQueryable<T> sortedQuery = query.OrderBy(Expression.Lambda<Func<T,Object>>(mexpr, e));
return sortedQuery.Skip(low).Take(high - low + 1).AsEnumerable();
}
最後の手段として、 andのAsEnumerable()
前にいつでも実行できますが、SQL で選択できる場合でも、データベースからすべてのオブジェクトを取得する必要があります。Skip
Take
おそらく最良の代替手段は、リフレクションを使用してオブジェクト プロパティが を持っていることを確認してから、または?DataMemberAttribute
のいずれかを実行することを選択することです。query.OrderBy().Skip().Take().AsEnumerable()
query.AsEnumerable().OrderBy().Skip().Take()