【发布时间】:2011-08-04 23:58:32
【问题描述】:
我有一个实体类,我使用partial class 语法扩展了它以具有一些派生属性。我想使用IQueryable<T> 接口执行查询,该接口使用来自这些字段的信息,但我目前得到一个异常状态
指定的类型成员“标题”是 在 LINQ to Entities 中不受支持。 只有初始化器、实体成员和 实体导航属性是 支持。
这里是相关代码sn-ps。您可以假设 Entity 对象有一个名为 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();
}
作为最后的手段,我总是可以在Skip 和Take 之前执行AsEnumerable(),但这将涉及从数据库中检索所有 对象,即使选择可以是由 SQL 完成。
也许最好的替代方法是使用反射来检查对象属性是否具有DataMemberAttribute,然后选择执行query.OrderBy().Skip().Take().AsEnumerable() 或query.AsEnumerable().OrderBy().Skip().Take()?
【问题讨论】:
标签: reflection entity-framework-4 linq-to-entities iqueryable dynamic-linq