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# 实体框架与IEnumerable_C#_Linq_Entity Framework - Fatal编程技术网

C# 实体框架与IEnumerable

C# 实体框架与IEnumerable,c#,linq,entity-framework,C#,Linq,Entity Framework,我已经编写了一个分页函数,我希望它能实现EF安全的分页。似乎这个函数在分页之前执行EF查询,我希望它做的是将分页延迟到数据库。我以为IEnumerable是安全的,但似乎不是。这里发生了什么 private IEnumerable<T> PageList<T>(IEnumerable<T> list, PaginationOptions options) { return list.Skip((options.Page - 1) * options.R

我已经编写了一个分页函数,我希望它能实现EF安全的分页。似乎这个函数在分页之前执行EF查询,我希望它做的是将分页延迟到数据库。我以为IEnumerable是安全的,但似乎不是。这里发生了什么

private IEnumerable<T> PageList<T>(IEnumerable<T> list, PaginationOptions options)
{
    return list.Skip((options.Page - 1) * options.ResultsPerPage).Take(options.ResultsPerPage);
}
另外,我使用IEnumerable,因为有时该函数用于普通列表

我使用
IEnumerable
,因为有时此函数用于正常的
List
s

您可能想考虑编写<代码> IQueEngy//Cult>过载:

private IQueryable<T> PageList<T>(IQueryable<T> list, PaginationOptions options)
{
    return list.Skip((options.Page - 1) * options.ResultsPerPage).Take(options.ResultsPerPage);
}
private IQueryable页面列表(IQueryable列表、分页选项)
{
返回列表。跳过((options.Page-1)*options.ResultsPerPage)。获取(options.ResultsPerPage);
}
问题在于,由于输入是一个
IEnumerable
,因此在应用分页之前执行查询,因此您将获得所有记录,分页将在Linq to对象中完成

使用
IQueryable
会将查询的执行延迟到应用分页之后

我使用
IEnumerable
,因为有时此函数用于正常的
List
s

您可能想考虑编写<代码> IQueEngy//Cult>过载:

private IQueryable<T> PageList<T>(IQueryable<T> list, PaginationOptions options)
{
    return list.Skip((options.Page - 1) * options.ResultsPerPage).Take(options.ResultsPerPage);
}
private IQueryable页面列表(IQueryable列表、分页选项)
{
返回列表。跳过((options.Page-1)*options.ResultsPerPage)。获取(options.ResultsPerPage);
}
问题在于,由于输入是一个
IEnumerable
,因此在应用分页之前执行查询,因此您将获得所有记录,分页将在Linq to对象中完成

使用
IQueryable
会将查询的执行延迟到应用分页之后

我使用
IEnumerable
,因为有时此函数用于正常的
List
s

您可能想考虑编写<代码> IQueEngy//Cult>过载:

private IQueryable<T> PageList<T>(IQueryable<T> list, PaginationOptions options)
{
    return list.Skip((options.Page - 1) * options.ResultsPerPage).Take(options.ResultsPerPage);
}
private IQueryable页面列表(IQueryable列表、分页选项)
{
返回列表。跳过((options.Page-1)*options.ResultsPerPage)。获取(options.ResultsPerPage);
}
问题在于,由于输入是一个
IEnumerable
,因此在应用分页之前执行查询,因此您将获得所有记录,分页将在Linq to对象中完成

使用
IQueryable
会将查询的执行延迟到应用分页之后

我使用
IEnumerable
,因为有时此函数用于正常的
List
s

您可能想考虑编写<代码> IQueEngy//Cult>过载:

private IQueryable<T> PageList<T>(IQueryable<T> list, PaginationOptions options)
{
    return list.Skip((options.Page - 1) * options.ResultsPerPage).Take(options.ResultsPerPage);
}
private IQueryable页面列表(IQueryable列表、分页选项)
{
返回列表。跳过((options.Page-1)*options.ResultsPerPage)。获取(options.ResultsPerPage);
}
问题在于,由于输入是一个
IEnumerable
,因此在应用分页之前执行查询,因此您将获得所有记录,分页将在Linq to对象中完成


使用
IQueryable
会将查询的执行延迟到应用分页之后。

您调用的是
IEnumerable.Skip/Take
,而不是
IQueryable.Skip/Take

尝试使用
AsQueryable
方法:

return list.AsQueryable()
           .Skip((options.Page - 1) * options.ResultsPerPage)
           .Take(options.ResultsPerPage);

您正在调用
IEnumerable.Skip/Take
而不是
IQueryable.Skip/Take

尝试使用
AsQueryable
方法:

return list.AsQueryable()
           .Skip((options.Page - 1) * options.ResultsPerPage)
           .Take(options.ResultsPerPage);

您正在调用
IEnumerable.Skip/Take
而不是
IQueryable.Skip/Take

尝试使用
AsQueryable
方法:

return list.AsQueryable()
           .Skip((options.Page - 1) * options.ResultsPerPage)
           .Take(options.ResultsPerPage);

您正在调用
IEnumerable.Skip/Take
而不是
IQueryable.Skip/Take

尝试使用
AsQueryable
方法:

return list.AsQueryable()
           .Skip((options.Page - 1) * options.ResultsPerPage)
           .Take(options.ResultsPerPage);

无需将方法签名更改为
IQueryable
,因为它也是
IEnumerable
。@haim770是的,但是扩展方法将绑定到
IEnumerable
(Linq到对象)而不是
IQueryable
(查询提供程序)。我没有建议更改签名,我建议添加一个重载,因为您更改了重载版本的签名。我认为这只有在OP打算链接到它的更多LINQ(到提供者)调用时才有意义。只是澄清一下——我在这里实际做的是从我的所有存储库返回IQueryable。在阅读了您的答案和讨论之后,我清楚地意识到IQueryable意味着可以推迟执行。IEnumerable表示将立即执行。考虑到这一点,我已根据DStanley的回答将方法签名更改为IQueryable,尽管我感谢您的输入@haim770无需将方法签名更改为
IQueryable
,因为它也是
IEnumerable
。@haim770是的,但扩展方法将绑定到
IEnumerable
(Linq到对象)与
IQueryable
(查询提供程序)相比。我没有建议更改签名,我建议添加重载。您更改了重载版本的签名。我认为这只有在OP打算链接到它的更多LINQ(到提供者)调用时才有意义。只是澄清一下——我在这里实际做的是从我的所有存储库返回IQueryable。在阅读了您的答案和讨论之后,我清楚地意识到IQueryable意味着可以推迟执行。IEnumerable表示将立即执行。考虑到这一点,我已根据DStanley的回答将方法签名更改为IQueryable,尽管我感谢您的输入@haim770无需将方法签名更改为
IQueryable
,因为它也是
IEnumerable
。@haim770是的,但扩展方法将绑定到
IEnumerable
(Linq到对象)与
IQueryable
(查询提供程序)相比。我没有建议更改签名,我建议添加重载。您更改了重载的签名