转换LINQ跳过并进入自定义分页逻辑

时间:2015-03-13 16:35:49

标签: c# asp.net linq rest

我正在使用ASP.NET Web API来创建RESTful API。 典型的控制器使用LINQ to对象从我的存储库请求实体。我的存储库没有使用Entity Framework,也没有访问任何数据库。相反,它使用外部RESTFul服务进行数据访问。 控制器使用Skip()和Take()来实现分页。

我想了解的部分是在调用外部Web服务时将Skip()和Take()转换为请求参数是否有意义。换句话说:我很想知道是否可以使用LINQ的Skip()和Take()来调用外部Web服务的调用,而不是在包含所有对象的结果IEnumerable上应用分页。

这是从我自己的存储库中检索数据的典型LINQ语句。

var userRoles = from userRole in Repository.UserRole.Load()
                            .Skip(10)
                            .Take (10)
                            select ModelFactory.Create(userRole);

我的存储库将从外部Web服务请求数据,如下所示:

protected override IEnumerable<UserRole> LoadAll()
{
    //....
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(GetUrl());
    string parameters = 
             String.Format("?sessionkey={0}&take={1}&skip={2}", take, skip, Session);
    HttpResponseMessage response = client.GetAsync(parameters).Result;
    //....skipped. deseralize response using JsonConvert and return IEnumerable<UserRole>
}

是否可以合理地使用LINQ查询并将其转换为Web请求的take和skip参数,或者我应该通过普通的旧跳过&amp;将整数参数带到LoadAll()方法?

1 个答案:

答案 0 :(得分:1)

只需将takeskip值传递到您的LoadAll()方法中(或者我的偏好是使用pagepageSize值并将其转换为takeskip)。

尽管最有可能提出一些LINQ提供程序,它允许提取所使用的TakeSkip并以某种方式将它们路由到您的系统,但这比较复杂。它可以提供的任何好处。

如果您担心明确的takeskip参数会公开您的存储库的实施细节,那就更有理由使用pagepageSize,并在幕后将这些转换为takeskip。我要说这不会暴露你的存储库如何进行分页。