首页 > 解决方案 > 如何在 C# EF dbquery 语句中使用 func 进行排序?

问题描述

我必须进行多部分排序并希望动态进行。

我发现了这个问题,但不知道如何func在 dbquery 语句中使用。

'System.Linq.Queryable' 类型上没有通用方法 'ThenBy'

如果我能让线程中的代码工作,那将是必杀技。

我看到的所有示例都thenwhere语句中使用,但我需要使用该函数进行排序。

我已经使用 IQueryable 编写了扩展,包括用于 orderby 和 orderbydescending 的扩展。问题是thenbythenbydescending使用iorderedqueryable

使用 ThenByProperty 时出现的错误是

“System.Data.Entity.Infrastructure.DbQuery 1[ORMModel.v_Brand]' cannot be converted to type 'System.Linq.IOrderedEnumerable1[ORMModel.v_Brand]”类型的对象。

当我使用类似的 OrderByProperty 扩展时,不会出现这样的错误。

真是一团糟,显然我不经常在这里发帖。无论如何,我很困惑而且一无所知,所以非常感谢任何提示。

试图发布代码,但不断收到格式错误,所以放弃了。但无论如何都要帮助我:)

标签: linqfunc

解决方案


如果你使用方法语法,你会经常看到 func ,例如在Where, GroupBy,Join

每个具有一些输入参数和一个返回值的方法都可以转换Func<...>为如下

MyReturnType DoSomething(ParameterType1 p1, ParameterType2, p2) {...}

Func<ParameterType1, ParameterType2, MyReturnType> myFunc = (x, y) => DoSomething(x, y);

该部分的Func<ParameterType1, ParameterType2, MyReturnType>意思是:一个有两个输入参数和一个返回值的函数。输入参数的类型为ParameterType1ParameterType2,按此顺序排列。返回值为MyReturnType

Func<ParameterType1, ParameterType2, MyReturnType>您使用 lambda 表达式实例化一个对象。在=>为输入参数键入声明之前,在=>使用这些输入参数调用函数之后。如果您有多个输入参数,请将它们用括号括起来以逗号分隔。

对于 aWhere你需要一个Func<TSource, bool>. 所以一个函数,它有一个源元素作为输入,结果是一个布尔值:

Where(x => x.Name == "John Doe")

对于 GroupJoin,您需要一个 resultSelector 类型Func<TOuter,System.Collections.Generic.IEnumerable<TInner>,TResult> resultSelector

所以这是一个以外部序列的一个元素和内部序列的元素序列作为输入的函数。例如,查询教师和学生:

var result = Teachers.GroupJoin(Students,
    teacher => teacher.Id,           // from every Teacher take the Id,
    student => student.TeacherId,    // from every Student take the TeacherId,
    (teacher, students) => new
    {
        Id = teacher.Id,
        Name = teacher.Name,
        Students = students.Select(student => new
        {
            Id = student.Id,
            Name = student.Name,
        })
        .ToList(),
    });

在这里您可以看到几个功能。TOuter 是教师,TInner 是学生,TKey 是 int

  • OuterKeySelector: Func<TOuter, TKey>: 老师 => 老师.Id
  • InnerKeySelector: Func<TInner, TKey>: 学生 => student.TeacherId
  • 结果选择器:Func<Touter, IEnumerable<TInner>, TResult>

resultSelector 是一个函数,它采用一个 TOuter(教师)和一系列 TInner(该教师的所有学生)并使用输入参数创建一个对象

(teacher, students) => new {... use teacher and students }

在创建 lambda 表达式时,如果您使用复数来指代集合(教师、学生)和单数(如果您指代集合的一个元素(学生)),通常会很有帮助。

使用=>开始定义函数。您可以使用之前定义的输入参数来=>定义之后的结果=>


推荐阅读