2011-03-25 67 views
4

我必须写的代码为以下方法:在哪里做分页/过滤?在数据库或代码中?

public IEnumerable<Product> GetProducts(int pageNumber, int pageSize, string sortKey, string sortDirection, string locale, string filterKey, string filterValue) 

的方法,将由web UI被使用并且必须支持分页,排序和过滤。数据库(SQL Server 2008)拥有约250,000个产品。我的问题如下:我在哪里实现分页,排序和过滤逻辑?我应该在T-SQL存储过程还是C#代码中执行?

我认为如果我在T-SQL中执行它会更好,但最终会出现一个非常复杂的查询。另一方面,在C#中这样做意味着我必须加载整个产品列表,这也是不好的...

任何想法这里最好的选择是什么?我错过了一个选项吗?

回答

4

你肯定会希望让DB为你做这个。从数据库中为每个请求移动〜250K记录将是一个巨大的开销。如果您使用的是LINQ-to-SQL,则SkipTake方法将执行此操作(here is an example),但我不确切知道它们的效率。

1

我认为其他(和潜在的最好的)选项是使用一些更高级别的框架,以避免查询写作的复杂性。 EntityFramework,NHibernate和LINQ(toSQL)可以帮助你很多。这就是说数据库通常是最适合您的情况。

1

今天本身我为我的网站实施分页。尽管我正在使用Entity-Framework,但我已经完成了存储过程。我发现执行一个复杂的查询更好,然后获取所有记录并使用代码进行分页。因此,使用存储过程。 我看到你的代码行,你已经附加,我只用相同的方式实现。

1

我会definatly做一个存储过程的东西沿着线:

SELECT * FROM (
    SELECT 
      ROW_NUMBER() OVER (ORDER BY Quantity) AS row, * 
    FROM Products 
) AS a WHERE row BETWEEN 11 AND 20 

如果你正在使用LINQ则采取和Skip方法将照顾这对你。

0

绝对在数据库中,如果有可能的话。

有时候你可以混合一些东西,比如如果你有从数据库函数返回的结果(不是存储过程,函数可能是存储过程无法处理的较大查询的一部分),那么你可以有另一个函数顺序和分页,或者可能使用Linq2SQL或类似的函数调用所述函数的结果页面,根据需要生成正确的SQL。

如果您至少可以在数据库中完成排序,并且通常只需要前几页(经常发生在实际使用中),那么您至少可以在这些情况下具有合理的性能,因为只有足够的行跳转到,然后取,需要的行需要从数据库加载。您当然仍然需要测试在那些真正寻找第1,2312页的罕见情况下,性能是否合理!

尽管如此,这只是对分页非常困难的情况的妥协,因为除非由于某些原因非常困难,或者总行数保证较低,否则通常在DB中进行页面切换。