如何在C#EF dbquery语句中使用func进行排序?

时间:2019-01-30 21:23:35

标签: linq func

我必须进行多部分排序,并且要动态地进行。

我发现了这个问题,但是不知道如何在dbquery语句中使用Holidays_Number_lbl.Text = "1" + "20"; //The result become 120

No generic method 'ThenBy' on type 'System.Linq.Queryable'

如果我可以使线程中的代码正常工作,那将是必杀技。

我看到的所有示例在 $idArray = [ // contains some 50-100 elements in total "BANANA", "APPLE", "COCONUT", "PEAR", ]; foreach($idArray as $val) { $query = "SELECT * FROM {$tableName} WHERE ID = '{$val}'"; $result = mysqli_query($conn, $query) or die('error'); while($data = mysqli_fetch_array($result)) { $$val = $data["COINFO"]; } } 语句中都使用func,但是我需要使用该函数进行排序。

我使用IQueryable编写了扩展名,包括orderby和orderbydescending的扩展名。问题是thenwhere使用thenby

使用ThenByProperty时出现的错误是

类型为“ System.Data.Entity.Infrastructure.DbQuery thenbydescending 1 [ORMModel.v_Brand]”的对象。

当我使用类似的OrderByProperty扩展名时,不要出现此类错误。

真是一团糟,显然我不在这里经常发帖。无论如何,我感到迷茫而无知,因此非常感谢任何提示。

试图发布代码,但不断出现格式错误,因此放弃了。但是无论如何请帮助我:)

1 个答案:

答案 0 :(得分:0)

如果使用方法语法,则会经常看到func,例如在WhereGroupByJoin等中

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

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

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

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

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

对于Where,您需要一个Func<TSource, bool>。因此,一个函数具有一个输入源元素,结果是一个布尔值:

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

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

的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(),
    });

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

  • OuterKeySelector:Func<TOuter, TKey>:老师=> Teacher.Id
  • InnerKeySelector:Func<TInner, TKey>:学生=> student.TeacherId
  • ResultSelector:Func<Touter, IEnumerable<TInner>, TResult>

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

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

在创建lambda表达式时,如果您使用复数形式引用集合(老师,学生),而使用单数形式引用集合(学生)中的一个元素,则通常会很有帮助。

使用=>开始定义功能。您可以使用=>之前定义的输入参数来定义=>

之后的结果