调用 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# 语法中重现此行为。
我在尝试执行 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# 语法中重现此行为。