如何解决重载 LINQ List.Contains() 以接受列名
我想修改以下程序
public async Task<IActionResult> GetMany(List<int> values)
{
List<TEntity> entities = await _crudApiDbContext.Set<TEntity>()
.Where(entity => values.Contains(entity.Id)).ToListAsync();
return new OkObjectResult(entities);
}
接受将在Contains方法中搜索的列名,例如:
public async Task<IActionResult> GetMany(List<int> values,string colName)
{
List<TEntity> entities = await _crudApiDbContext.Set<TEntity>()
.Where(entity => values.Contains<TEntity>(colName)).ToListAsync();
return new OkObjectResult(entities);
}
我尝试过重载包含和使用表达式树但迷路了...
有什么想法吗?
解决方法
引入以下扩展方法,该方法应按集合过滤任何实体类型:
public static class QueryableExtensions
{
public static IQueryable<TEntity> FilterByList<TEntity,TKey>(this IQueryable<TEntity> query,IEnumerable<TKey> values,string colName)
where TEntity : class
{
var param = Expression.Parameter(typeof(TEntity),"e");
var propAccess = Expression.PropertyOrField(param,colName);
var listExpr = Expression.Constant(values);
var predicate = Expression.Call(typeof(Enumerable),"Contains",new[] {typeof(TKey)},listExpr,propAccess);
var predicateLambda = Expression.Lambda<Func<TEntity,bool>>(predicate,param);
return query.Where(predicateLambda);
}
}
并将您的 GetMany
重写为此变体:
public async Task<IActionResult> GetMany<TEntity>(List<int> values,string colName)
{
var entities = await _crudApiDbContext.Set<TEntity>()
.FilterByList(values,colName)
.ToListAsync();
return new OkObjectResult(entities);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。