相关疑难解决方法(0)

如何在通用扩展方法中使用字符串列名在IQueryable上应用OrderBy?

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只能在运行时确定.

有没有解决的办法?

.net c# linq entity-framework expression-trees

83
推荐指数
5
解决办法
8万
查看次数

从要在 OrderBy 中使用的方法返回表达式

我想编写一个由子类覆盖的抽象方法,该方法的作用是返回一个表达式,随后在 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)

c# linq lambda expression-trees

5
推荐指数
1
解决办法
1907
查看次数

DotNetCore 实体框架 | 通用分页

我一直在寻找一种在 Dotnet Core 1.1 中使用实体框架进行通用分页的方法。

我在 MSDN 上找到了本指南:https://learn.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/sorting-filtering-and-paging -在 asp-net-mvc 应用程序中使用实体框架

但这不是通用的,不允许我重用代码。

如果有人正在研究这个问题,其中包括我使用的答案,我认为分享会很好。

它在模型上使用自定义属性,并返回分页模型。

api pagination entity-framework .net-core

5
推荐指数
1
解决办法
7790
查看次数

在 linq 查询中设置动态排序名称字段

我希望能够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)

我收到此错误:

“无法创建 [...] 类型的常量值。在此上下文中仅支持原始类型或枚举类型”

我确信有一种方法可以实现这一目标,但目前不确定如何实现。

.net c# linq entity-framework linq-to-sql

2
推荐指数
1
解决办法
2075
查看次数