C# 在调用跳过之前,必须调用Order by
尝试执行skip方法时出错。方法“Skip”仅支持LINQ to实体中的排序输入。方法“OrderBy”必须在方法“Skip”之前调用 我很清楚,必须在调用skip之前调用orderby,并且我正在调用调用之前的另一个函数中的skip之前调用它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)
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";