如何重载 LINQ IQueryable<TEntity> Where() 以接受列名



我想修改以下内容以接受将在Where方法中搜索的列名,类似于:

public TEntity GetEntity(int val)
{
TEntity entity = _DbContext.Set<TEntity>()
.Where(e => e.Id == val)
.FirstOrDefault();
return entity;
}

将更改为

public TEntity GetEntity(int val, string colName)
{
TEntity entity = _DbContext.Set<TEntity>()
.WhereWithColName(val, colName)
.FirstOrDefault();
return entity;
}

表达式树对我来说仍然太复杂…

好的,解决了它:

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);
var predicate = Expression.Equal(propAccess,valExpr);
var predicateLambda = Expression.Lambda<Func<TEntity, bool>>(predicate, param);
return query.Where(predicateLambda);
}

然后调用函数为:

public TEntity GetEntity(int val, string colName)
{
TEntity entity = _DbContext.Set<TEntity>()
.WhereById<TEntity, int>(val, colName)
.FirstOrDefault();
return entity;
}

最新更新