我正在构建一个新的扩展方法,它将能够动态地对来自实体框架的查询结果进行分组。
我已经能够使用 LinqKit 构建动态的“where”表达式,但这似乎是另一种动物。
新扩展方法的预期用途:
var results = entities.GroupBy("someFieldName").ToList();
扩展方法定义:
public static IQueryable<IGrouping<object, TEntity>> GroupBy<TEntity>(
this IQueryable<TEntity> source,
string fieldName)
where TEntity : class, IDataEntity
{
if (string.IsNullOrEmpty(fieldName))
{
return new List<IGrouping<object, TEntity>>().AsQueryable();
}
var parameter = Expression.Parameter(typeof(TEntity), "x");
var fieldXExpression = Expression.Property(parameter, fieldName);
var lambda = Expression.Lambda<Func<TEntity, object>>(
Expression.Convert(fieldXExpression, typeof(object)), // throws error when using EF
parameter);
return source.AsExpandable().GroupBy(lambda);
}
我需要使用Expression.Convert(...)
,因为当我使用 linqTOobjects 进行测试时,当列是int32
. 所以我需要手动将列转换为对象,效果很好。
现在我正在使用 EF 实体对其进行测试,我猜想 EF 正在尝试将转换转换为等效的 SQL,我当然知道它不存在。
错误:
System.NotSupportedException: Unable to cast the type 'System.String' to type 'System.Object'. LINQ to Entities only supports casting EDM primitive or enumeration types.
有没有办法在运行时生成适合 GroupBy 的表达式,并且也与 EF 兼容?
感谢您的任何指导。