【发布时间】:2017-02-04 22:50:45
【问题描述】:
这是对我的问题Dynamic Expression Generation Issues with ValueTypes 的后续处理,添加了一个新变量:实体框架。现在我能够在处理 ValueTypes 时生成必要的表达式,当 Linq-to-Entities 尝试处理查询时,我遇到了一个新问题。我收到以下错误:
System.NotSupportedException:无法将类型“System.Int32”转换为类型“System.Object”。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。
显然 Linq-to-Entities 不喜欢盒装值。这在我强制处理查询(通过ToList() 或其他类型方法)时有效,但在数据库完成时无效,这将是理想的。
有没有办法让这个方法更通用,让 Linq-to-Entities 满意?请记住,直到运行时我才知道属性的类型。
public IEnumerable<Expression<Func<T, object>>> GetExpressions<T>(string sortedColumn) where T : IReportRecord
{
var columns = GetFullSortOrder(sortedColumn);
var typeParameter = Expression.Parameter(typeof(T));
foreach (var c in columns)
{
var propParameter = Expression.Property(typeParameter, c);
if (propParameter.Type.IsValueType)
{
var boxedPropParameter = Expression.Convert(propParameter, typeof(object));
yield return Expression.Lambda<Func<T, object>>(boxedPropParameter, typeParameter);
}
else
{
yield return Expression.Lambda<Func<T, object>>(propParameter, typeParameter);
}
}
}
【问题讨论】:
-
您可以像这样动态地将您的订单直接应用到
IQueryable,而不是生成Expressions:stackoverflow.com/questions/41244/…
标签: c# entity-framework linq dynamic linq-expressions