Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在调用跳过之前,必须调用Order by_C#_Linq_Skip - Fatal编程技术网

C# 在调用跳过之前,必须调用Order by

C# 在调用跳过之前,必须调用Order by,c#,linq,skip,C#,Linq,Skip,尝试执行skip方法时出错。方法“Skip”仅支持LINQ to实体中的排序输入。方法“OrderBy”必须在方法“Skip”之前调用 我很清楚,必须在调用skip之前调用orderby,并且我正在调用调用之前的另一个函数中的skip之前调用它 AddOrderBy(AdvTitleResults, ColumnNumber, OrderByDesc); var SearchTitles = AdvTitleResults.Skip(PageNum * NumberOfResults)

尝试执行skip方法时出错。方法“Skip”仅支持LINQ to实体中的排序输入。方法“OrderBy”必须在方法“Skip”之前调用

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

AddOrderBy(AdvTitleResults, ColumnNumber, OrderByDesc);

var SearchTitles = AdvTitleResults.Skip(PageNum * NumberOfResults)
                                  .Take(NumberOfResults).ToList();
order by函数如下所示:默认值确保始终为其赋值:

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;
    }
}
private void AddOrderBy(IQueryable结果、int ColumnNumber、bool OrderByDesc)
{
开关(列号)
{
案例1:
if(OrderByDesc)
结果=结果.OrderByDescending(t=>t.FK_ContentType);
其他的
Results=Results.OrderBy(t=>t.FK_ContentType);
打破
案例2:
if(OrderByDesc)
结果=Results.OrderByDescending(t=>t.TitleFullName);
其他的
结果=Results.OrderBy(t=>t.TitleFullName);
打破
违约:
if(OrderByDesc)
Results=Results.OrderByDescending(t=>t.ID);
其他的
Results=Results.OrderBy(t=>t.ID);
打破
}
}

有人能解释一下为什么这不起作用吗

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

AddOrderBy(ref AvTitleResults, ColumnNumber, OrderByDesc);

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

编辑:

IQueryable不是一个类吗?默认情况下,它不应该通过引用传递吗

IQueryable
不是类,但它是引用类型。但是引用类型实际上并不是按引用传递的。当传递引用类型时,变量持有的引用值将复制到新变量中。如下所示:

string foo = "Foo";
string bar = foo; // copy foo's reference into bar
现在,如果您为
bar
指定一个新的引用,它将不会更改
foo

bar = "bar";

因为它们是不同的变量,持有对同一地址的引用。但是当您使用
ref
关键字时,引用值不会被复制。相反,您可以认为变量本身是被传递的。这是最容易理解的方法。我不知道如何用C#语法重现这种行为。

他真的应该返回新的查询,而不是使用
ref
。难道一个类不应该默认按ref传递吗?@Space当然可以。这不会改变您通过值而不是引用传递对列表的引用的事实。@空格是的,会的,因为传入的值是对列表的引用,而不是对变量的引用(包含对列表的引用)。您可以修改列表,但不能修改指向该列表的变量(除非使用
ref
)。@Space使用类型的成员和分配新引用是不同的。我已经对裁判的行为做了解释,我希望这会有所帮助
string foo = "Foo";
string bar = foo; // copy foo's reference into bar
bar = "bar";