我正在嘗試修改通用 IQueryable 擴展方法以執行 GroupBy 操作。我在動態定義的列上執行通用 Where 的方法:
public static IQueryable<TEntity> WhereById<TEntity, TKey>(
this IQueryable<TEntity> query, TKey value, string colName)
where TEntity : class
{
var param = Expression.Parameter(typeof(TEntity), "e");
var propAccess = Expression.PropertyOrField(param, colName);
var valExpr = Expression.Constant(value);
BinaryExpression predicate;
predicate = Expression.Equal(propAccess, valExpr);
var predicateLambda = Expression.Lambda<Func<TEntity, bool>>(predicate, param);
return query.Where(predicateLambda);
}
這非常有效,如下所示:
IQueryable<TEntity> entities = _crudApiDbContext.Set<TEntity>()
.WhereById<TEntity, int>(id, selectField);
現在我需要一個通用的 GroupBy()。我正在嘗試以下操作:
public static IQueryable<TEntity> GroupBy<TEntity>(this IQueryable<TEntity> query, string colName)
where TEntity : class
{
var param = Expression.Parameter(typeof(TEntity), "e");
var propAccess = Expression.PropertyOrField(param, colName);
BinaryExpression predicate;
predicate = Expression.XXX(propAccess); <=what should XXX be?
var predicateLambda = Expression.Lambda<Func<TEntity, int>>(propAccess);
return (IQueryable<TEntity>)query.GroupBy(predicateLambda);
}
我想我的問題是 XXX 應該是什么?或者可能因為 GroupBy() 是一種擴展方法,所以方法需要不同?
更新
關于為什么我需要這個有很多興趣 - 我正在構建一個用于分面瀏覽的通用 Blazor 表單。所以我有一個用于過濾和排序搜索的通用方法,但我還需要知道某些帶有選項的列,在應用搜索條件后還有多少選項。為此,我將使用應用了搜索條件的 IQueryable 對這些列中的每一列執行 GroupBy。分面搜索示例:

uj5u.com熱心網友回復:
這是如何按動態欄位進行分組的解決方案。由于我們不知道分組鍵的型別,因此我決定將其設為object.
public static class QueryableExtensions
{
static Expression MakePropPath(Expression objExpression, string path)
{
return path.Split('.').Aggregate(objExpression, Expression.PropertyOrField);
}
public static IQueryable<IGrouping<object, TEntity>> GroupBy<TEntity>(this IQueryable<TEntity> query, string colName)
where TEntity : class
{
var param = Expression.Parameter(typeof(TEntity), "e");
var propAccess = MakePropPath(param, colName);
var keyLambda = Expression.Lambda(Expression.Convert(propAccess, typeof(object)), param);
var groupCall = Expression.Call(typeof(Queryable), nameof(Queryable.GroupBy),
new[] { typeof(TEntity), typeof(object) }, query.Expression,
keyLambda);
return query.Provider.CreateQuery<IGrouping<object, TEntity>>(groupCall);
}
}
在您的情況下使用很簡單:
var result = query.GroupBy("Genre")
.Select(g => new
{
g.Key,
Count = g.Count()
})
.ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311157.html
上一篇:T型如何使用set()方法
