如何解决我可以在非实体成员字段上创建LINQ到实体查询
|| 我有一个实体类,已使用partial class
语法进行了扩展,以具有某些派生属性。我想使用IQueryable<T>
接口执行查询,该接口使用这些字段中的信息,但是我目前收到一个异常,指出
指定的类型成员\'Title \'为
LINQ to Entities不支持。
仅初始化器,实体成员和
实体导航属性是
支持的。
以下是相关的代码段。您可以假定Entity对象具有名为Id
的String成员。
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()
?
解决方法
不,您不能,因为linq-to-entities查询只是将表达式树转换为SQL。要将树转换为SQL,将使用您的实体映射,并且由于
Title
不在映射中,因此它将引发异常。
在Skip
和Take
之前调用AsEnumerable
听起来很糟糕,因为它将始终将整个数据表的内容传输到您的应用程序。这将非常慢,并且在大数据表的情况下也无济于事。
如果这是本地化问题,则您的数据库必须包含本地化的字符串才能使其生效。同时,如果只需要很少的记录就可以加载所有记录。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。