Reflection 我可以在非实体成员字段上创建LINQ到实体查询吗

Reflection 我可以在非实体成员字段上创建LINQ到实体查询吗,reflection,entity-framework-4,linq-to-entities,iqueryable,dynamic-linq,Reflection,Entity Framework 4,Linq To Entities,Iqueryable,Dynamic Linq,我有一个实体类,我使用分部类语法对其进行了扩展,以获得一些派生属性。我想使用IQueryable接口执行一个查询,该接口使用这些字段中的信息,但我当前得到一个异常,该异常表示 指定的类型成员“Title”为 LINQ to实体中不支持。 仅初始值设定项、实体成员和 实体导航属性为 支持 下面是相关的代码片段。您可以假设实体对象有一个名为Id的字符串成员 public partial class MyEntityObject { public String Title { get { ret

我有一个实体类,我使用
分部类
语法对其进行了扩展,以获得一些派生属性。我想使用
IQueryable
接口执行一个查询,该接口使用这些字段中的信息,但我当前得到一个异常,该异常表示

指定的类型成员“Title”为 LINQ to实体中不支持。 仅初始值设定项、实体成员和 实体导航属性为 支持

下面是相关的代码片段。您可以假设实体对象有一个名为
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();
}
公共部分类MyEntityObject
{
公共字符串标题{get{return MyStrings.ResourceManager.GetString(Id)??“”;}
}
/**
*尝试对“MyEntityObject”的“标题”字段排序时引发异常
*/
公共IEnumerable查询(字符串字段名、整型低、整型高)
{
//使用存储库模式获取ObjectContext
var query=context.GetRepository()
//通过动态构建表达式树,基于字段创建OrderBy子句
//看http://stackoverflow.com/questions/4546463/help-with-linq-and-generics-using-getvalue-inside-a-query
PropertyInfo PropertyInfo=typeof(T).GetProperty(fieldName);
ParameterExpression e=表达式。参数(类型(T),“e”);
MemberExpression mexpr=Expression.MakeMemberAccess(e,propertyInfo);
IQueryable sortedQuery=query.OrderBy(Expression.Lambda(mexpr,e));
return sortedQuery.Skip(low).Take(high-low+1).AsEnumerable();
}
最后,我可以在
跳过
获取
之前执行
AsEnumerable()
,但这将涉及从数据库中检索所有对象,即使选择可以通过SQL完成


也许最好的替代方法是使用反射检查对象属性是否具有
DataMemberAttribute
,然后选择执行
query.OrderBy().Skip().Take().AsEnumerable()
query.AsEnumerable().OrderBy().Skip().Take()

不可以,因为linq to entities查询只是将表达式树转换为SQL。要将树转换为SQL,将使用实体映射,因为映射中没有
Title
,所以将引发异常

Skip
Take
之前调用
AsEnumerable
,听起来像是非常糟糕的设计,因为它总是将整个数据表的内容传输到应用程序中。这将是非常缓慢的,在大数据表的情况下也没有用


如果这是一个本地化问题,您的数据库必须包含本地化字符串才能使其有效。同时,如果您只需要使用很少的记录就可以加载所有记录。

数据集应该很小(最多只有几百条记录),因此加载所有记录是可以接受的折衷方案。数百条记录听起来不像是小数据。如果多个客户端同时请求这些数据,则会产生大量数据。此外,对于EF上下文,由于物化默认跟踪等原因,记录的搜索量很大。这些查询仍然可能很慢。这些记录通过Dojo JsonRestStore直接传递给web客户端,因此我们在分离模式下操作。有没有办法让EF不创建跟踪信息,只返回处于分离状态的对象?有。您必须首先从
ObjectSet
获取
ObjectQuery
,然后将
MergeOption
设置为
MergeOption。NoTracking
。是否有人找到了这类问题的可行解决方案。我想要一个的原因是从linq语句中抽象出某些逻辑,也就是说,我不需要到处重复业务逻辑。多年来我一直在考虑解决这个问题的办法。。。。