我正在使用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()方法?
答案 0 :(得分:1)
只需将take
和skip
值传递到您的LoadAll()
方法中(或者我的偏好是使用page
和pageSize
值并将其转换为take
和skip
)。
尽管最有可能提出一些LINQ提供程序,它允许提取所使用的Take
和Skip
并以某种方式将它们路由到您的系统,但这比较复杂。它可以提供的任何好处。
如果您担心明确的take
和skip
参数会公开您的存储库的实施细节,那就更有理由使用page
和pageSize
,并在幕后将这些转换为take
和skip
。我要说这不会暴露你的存储库如何进行分页。