public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName)
where T : EntityObject
{
var param = Expression.Parameter(typeof(T), "o");
var body = Expression.PropertyOrField(param,columnName);
var sortExpression = Expression.Lambda(body, param);
return query.OrderBy(sortExpression);
}
Run Code Online (Sandbox Code Playgroud)
因为OrderBy的类型不是从sortExpression中推断出来的,所以我需要在运行时指定类似的东西:
var sortExpression = Expression.Lambda<T, TSortColumn>(body, param);
Run Code Online (Sandbox Code Playgroud)
要么
return query.OrderBy<T, TSortColumn>(sortExpression);
Run Code Online (Sandbox Code Playgroud)
我不认为这是可能的,因为TSortColumn只能在运行时确定.
有没有解决的办法?
我想编写一个由子类覆盖的抽象方法,该方法的作用是返回一个表达式,随后在 LINQ 中使用OrderBy()。像这样的东西:
注意:Message继承自Notes类,MyModel继承自MsgModel.
public class Notes
{
// abstract definition; using object so that I can (I hope) order by int, string, etc.
public abstract Expression<Func<MsgModel, object>> OrderByField();
// ...
private string GetOrderByFieldName()
{
// I am not sure how to write this
// This is my problem 2. Please see below for problem 1 :-(
var lambda = OrderByField() as LambdaExpression;
MemberExpression member = lambda.Body as MemberExpression;
PropertyInfo …Run Code Online (Sandbox Code Playgroud) 我一直在寻找一种在 Dotnet Core 1.1 中使用实体框架进行通用分页的方法。
但这不是通用的,不允许我重用代码。
如果有人正在研究这个问题,其中包括我使用的答案,我认为分享会很好。
它在模型上使用自定义属性,并返回分页模型。
我希望能够OrderBy使用 lambda 表达式进行查询,以便获得带有 TOP(n) 关键字的 SQL 查询(性能大幅提升)。
如果我指定的话我就能做到这一点...
PaginatedList = query.OrderBy(x => x.QuoteID).Skip(() => skipValue).Take(() => pageSize)
Run Code Online (Sandbox Code Playgroud)
但因为我希望 orderBy 字段通过 UI 选择名称而动态化,所以我想做这样的事情:
var propertyInfo = typeof(Data.Quote).GetProperty(sortName);
Expression<Func<Data.Quote, object>> orderField = x => propertyInfo.GetValue(x, null);
PaginatedList = query.OrderBy(orderField).Skip(() => skipValue).Take(() => pageSize)
Run Code Online (Sandbox Code Playgroud)
这给了我错误:
“LINQ to Entities 无法识别‘System.Object GetValue(System.Object)’方法,并且该方法无法转换为存储表达式。”
我试过这不是类型Expression<Func<T, object>>
var propertyInfo = typeof(Data.Quote).GetProperty(sortName);
Func<Data.Quote, object> orderField = x => propertyInfo.GetValue(x, null);
PaginatedList = query.OrderBy(x => orderField).Skip(() => skipValue).Take(() => pageSize)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
“无法创建 [...] 类型的常量值。在此上下文中仅支持原始类型或枚举类型”
我确信有一种方法可以实现这一目标,但目前不确定如何实现。