3

我将 C# MVC4 与 Linq 一起使用。

我为我的项目使用了依赖注入,这导致我拥有一个单独的模型项目以及一个单独的存储库项目(以及一个用于测试等)。这一切都没有问题。

我将查询从控制器(旧样式)移到存储库(新 DI 样式)中,然后注入它们。它工作正常。

我有一个标准的 linq 查询(选择任何示例,它们都足够基本),它照常从数据库中返回一组项目。这里也没有问题。

我的问题是,我想实现分页,而且我教它很简单。这是我的步骤:

从存储库中获取 linq 查询的结果(注入到控制器中)将其存储在 var 中。它看起来像:

var results = _someInjectedCode.GetListById(SomeId);

之前,我可以做一些简单的事情,比如:

results.Count()
results.Skip(SomeNum).Take(SomeOtherNum)

但是现在我想要分页,我需要做我的 Skip Take 像这样的事情:

var results = from xyz in _someInjectedCode.GetListById(SomeId).SomeId).Skip(SomeNum).Take(SomeOtherNum)
select new[] {a,id, a.fName, a.lName .....}

这样做的问题是,在列表缩短到 Pre Skip...Take 状态之前,我不再有权访问项目的总数,除非我执行两个查询,这意味着两次访问数据库。

解决此问题的最佳方法是什么。

4

3 回答 3

2

从 SQL 的角度考虑,我想不出在单个普通查询中同时检索总计数和数据子集的方法,所以我认为您无法做到LINQ 也可以。

为了避免创建两个单独的命令,我唯一能想到的是一个存储过程,它返回两个表(一个只有计数,另一个带有结果子集)。它仍然会执行两个查询,但在一个连接中。你会失去你的LINQ。因此,如果您想保留您的 LINQ 查询,您可能会被困在进行两个单独的调用。

另一种方法是将整个未分页的结果集检索到内存中,然后对数组运行Take和运行Skip,但这非常浪费,可能比两次调用更糟糕。

于 2013-04-24T16:23:25.577 回答
2

我只是这样做:

var result = (from n in mycollection 
              where n.someprop == "some value" 
              select n).ToList();
var count = result.Count;

可能还有其他方法,但这是我所知道的最简单的方法。

于 2013-04-24T16:42:13.097 回答
1

您可以向存储库接口/类添加其他参数,这些参数将提供分页参数并在结果旁边返回计数,或者修改接口以返回 IQueryable,然后应用计数,然后在编译查询并发送执行之前跳过/获取。

于 2013-04-24T16:35:07.027 回答