调用 skip 之前必须调用 order by

Order by must be called before calling a skip

我在尝试执行 skip 方法时遇到错误。方法 'Skip' 仅支持 LINQ to Entities 中的排序输入。必须在方法 'Skip'.

之前调用方法 'OrderBy'

我很清楚必须在调用 skip 之前调用 orderby,并且我在调用之前的另一个函数中直接在 skip 之前调用它。

AddOrderBy(AdvTitleResults, ColumnNumber, OrderByDesc);

var SearchTitles = AdvTitleResults.Skip(PageNum * NumberOfResults)
                                  .Take(NumberOfResults).ToList();

按函数顺序看起来像这样默认确保它总是被分配:

private void AddOrderBy(IQueryable<Title> Results, int ColumnNumber, bool OrderByDesc)
{
    switch (ColumnNumber)
    {
        case 1:
            if (OrderByDesc)
                Results = Results.OrderByDescending(t => t.FK_ContentType);
           else
                Results = Results.OrderBy(t => t.FK_ContentType);
            break;
        case 2:
            if (OrderByDesc)
                Results = Results.OrderByDescending(t => t.TitleFullName);
            else
                Results = Results.OrderBy(t => t.TitleFullName);
            break;
        default:
            if (OrderByDesc)
                Results = Results.OrderByDescending(t => t.ID);
            else
                Results = Results.OrderBy(t => t.ID);
            break;
    }
}

谁能解释为什么这不起作用?

因为您实际上并没有更改 AdvTitleResults,所以您正在更改参数的值。您需要使用 ref 关键字才能使其工作:

AddOrderBy(ref AvTitleResults, ColumnNumber, OrderByDesc);

private void AddOrderBy(ref IQueryable<Title> Results, 
                        int ColumnNumber, 
                        bool OrderByDesc)

或者您可以使用 LINQ 样式并将其作为扩展方法,return 查询:

private IOrderedQueryable<Title> AddOrderBy(this IQueryable<Title> Results, int ColumnNumber, bool OrderByDesc)
{
    switch (ColumnNumber)
    {
        case 1:
            if (OrderByDesc)
                return Results.OrderByDescending(t => t.FK_ContentType);
           else
                return Results.OrderBy(t => t.FK_ContentType);
            break;
        case 2:
            if (OrderByDesc)
                return Results.OrderByDescending(t => t.TitleFullName);
            else
                return Results.OrderBy(t => t.TitleFullName);
            break;
        default:
            if (OrderByDesc)
                return Results.OrderByDescending(t => t.ID);
            else
                return Results.OrderBy(t => t.ID);
            break;
    }
}

这样您就可以像调用任何其他 LINQ 方法一样调用它:

var SearchTitles = AdvTitleResults
      .AddOrderBy(ColumnNumber, OrderByDesc)
      .Skip(PageNum * NumberOfResults)
      .Take(NumberOfResults)
      .ToList();

编辑:

isn't IQueryable a class shouldn't this be pass by ref by default?

IQueryable<Title> 不是 class 但它是引用类型。但是引用类型不是实际上通过reference.When你传递了一个引用类型,你的变量持有的引用值将被复制到一个新的 variable.It 是这样的:

string foo = "Foo";
string bar = foo; // copy foo's reference into bar

现在,如果您为 bar 分配一个新引用,它不会更改 foo:

bar = "bar";

因为它们是不同的变量,当您使用 ref 关键字时,它们持有对相同 address.But 的引用,因此引用值不是 copied.Instead 您可以认为变量本身是 passed.That 是理解这一点的最简单方法。我不知道如何在 C# 语法中重现此行为。