【发布时间】:2019-12-26 08:13:55
【问题描述】:
我想创建一个模仿这个的扩展方法,https://dejanstojanovic.net/aspnet/2019/january/filtering-and-paging-in-aspnet-core-web-api/
但是,我想在 StartsWith 之后添加一个 OrderBy(对于 ColumnName),我将如何执行此操作?
尝试添加以下但没有工作.OrderBy(参数)
示例:
return persons.Where(p => p.Name.StartsWith(filterModel.Term ?? String.Empty, StringComparison.InvariantCultureIgnoreCase))
.OrderBy(c=>c.Name)
.Skip((filterModel.Page-1) * filter.Limit)
.Take(filterModel.Limit);
public static class PaginateClass
{
static readonly MethodInfo startsWith = typeof(string).GetMethod("StartsWith", new[] { typeof(string), typeof(System.StringComparison) });
public static IEnumerable<T> Paginate<T>(this IEnumerable<T> input, PageModel pageModel, string columnName) where T : class
{
var type = typeof(T);
var propertyInfo = type.GetProperty(columnName);
//T p =>
var parameter = Expression.Parameter(type, "p");
//T p => p.ColumnName
var name = Expression.Property(parameter, propertyInfo);
// filterModel.Term ?? String.Empty
var term = Expression.Constant(pageModel.Term ?? String.Empty);
//StringComparison.InvariantCultureIgnoreCase
var comparison = Expression.Constant(StringComparison.InvariantCultureIgnoreCase);
//T p => p.ColumnName.StartsWith(filterModel.Term ?? String.Empty, StringComparison.InvariantCultureIgnoreCase)
var methodCall = Expression.Call(name, startsWith, term, comparison);
var lambda = Expression.Lambda<Func<T, bool>>(methodCall, parameter);
return input.Where(lambda.Compile()) //tried adding this and did not work .OrderBy(parameter)
.Skip((pageModel.Page - 1) * pageModel.Limit)
.Take(pageModel.Limit);
}
其他项目PageModel:
public class PageModel
{
public int Page { get; set; }
public int Limit { get; set; }
public string Term { get; set; }
public PageModel()
{
this.Page = 1;
this.Limit = 3;
}
public object Clone()
{
var jsonString = JsonConvert.SerializeObject(this);
return JsonConvert.DeserializeObject(jsonString, this.GetType());
}
}
【问题讨论】:
-
您希望
OrderBy提供动态列名,创建一个与StartsWith相同的表达式,它将是MethodCallExpression或检查System.Linq.Dynamic,它们提供开箱即用的扩展方法 -
嗨 @MrinalKamboj 公司不允许使用 linqdymiac,但是,请随时在回答中给出第一个建议,我可以发送积分,谢谢!
-
这是一个非常好的开源库,被你们屏蔽了
-
好的,我去看看,是这个吗? var test = MethodCallExpression.Call(typeof(Queryable), "OrderBy", new[] { type, propertyInfo.PropertyType }); return input.Where(lambda.Compile()).test .Skip((pageModel.Page - 1) * pageModel.Limit) .Take(pageModel.Limit);
标签: c# .net linq .net-core expression-trees