views:

1057

answers:

1

I am developing an application which includes a WCF service and its ASP.NET MVC client. The ASP.NET MVC website must display a grid of objects - say, products. These products are stored in database which is accessible through the WCF service. So somewhere inside an MVC controller I call WCF service's method that returns me an array of products that I need to display.

So what is my question? I want to implement a pager functionality for my products grid, because it is possible that there will be a lot of products. So there are several ways to do that:

  1. My controller can get the whole list of products and just do in-memory paging
  2. WCF can select all the products and store them somewhere in its cache, then pass to the controller only part of them, according to the requested page number.
  3. WCF can select only part of the products from the database, according to the requested page number.
  4. WCF can return IQueryable to the controller, and then the controller will select whatever he wants whenever he wants.

As far as I understand (and correct me if it is not true), the first option is useless, so I must choose between the others.

The second option wastes my server's memory.

The third option is OK, but it seems a little bit ugly to implement paging on the WCF side.

And the fourth option sounds confusing. I actually pass some kind of query to the client, and then he queries my database by himself, through the WCF service. I can't figure out how to implement this correctly.

So can you please help me to choose the correct way to implement this?

+2  A: 

What is your back-end database layer look like? If you're using LINQ (-to-SQL or -to-Entities), you could implement paging through WCF by specifying the page size and the page number you want, and then use LINQ's "Skip" and "Take" operators to fetch the page requested - something roughly like:

[ServiceContract]
public interface IFetchData
{
  [OperationContract]
  public List<Data> GetData(int pageSize, int pageNumber)
}

and then implement it something like this (simplified):

public class FetchDataService : IFetchData
{
  public List<Data> GetData(int pageSize, int pageNumber)
  {
      var query = yourContext.DataTable
                    .Skip((pageNumber - 1) * pageSize)
                    .Take(pageSize);

      return query.ToList();
  }
}

Would that be helpful for you??

Marc

marc_s
Yes, I am using LINQ-to-SQL. So what you are offering is actually my third option. Well, I'll probably go for it. I thought about some kind of lazy execution, when the WCF services passes IQueryable<T> to the client without actually selecting anything from the db. But I can't figure out how to do it
Dmitry Perets
Well, right now, with the current offerings, I think passing around IQueryable might be a tad difficult to do. But if you check out the MIX'09 video on "RIA Services" - that's exactly what MS is building now for Silverlight 3 - that'll probably solve all your problems :-)
marc_s