【发布时间】:2019-12-08 17:07:09
【问题描述】:
我正在从事一个个人项目,在该项目中我需要一些关于对数据库进行高性能 Linq 查询的帮助。有问题的数据库可能有数百万个日志条目,并且通过 API (Asp),我希望可以选择仅将这些日志的代表性子集返回到图形界面。
这是有问题的方法:
public IEnumerable<Log> GetByParameter(int ParameterID,DateTime timeStart, DateTime timeEnd)
{
return _context.Logs.Where
(a => a.ParameterID == ParameterID &&
(DateTime.Compare(a.LogDate,timeStart) > 0 && DateTime.Compare(a.LogDate,timeEnd) < 0)).ToList();
}
请注意,该方法接受两个 DateTimes 作为参数,这会产生应查询日志的时间范围。
我想像这样扩充这个方法:
public IEnumerable<Log> GetByParameter(int ParameterID,DateTime timeStart, DateTime timeEnd, int limit)
例如,给定传递的参数,数据库可能包含 200 万个条目,而 API 使用者的“限制”可能是 40000 个条目。因此:
numberOfEntries/limit = n
2*106 / 4*104 = 50
在此示例中,我希望将每 50 个元素返回给 API 的使用者,元素之间的时间间隔均匀。
一种简单的方法是在给定参数的情况下查询整个表,然后过滤掉,但这似乎很混乱,与这种方法有点对立,也可能非常无效。
所以这是我的问题:有没有办法编写一个查询,使它只查询每第 N 行的数据库?
提前致谢!
【问题讨论】:
-
你用的是什么数据库? SQL 服务器?
-
是否有理由限制您使用 LINQ (EF?)?
-
@Oliver 并不特别,除了我编写的其他代码是使用 Linq 之外,我想学习语法。我可以访问数据库,也可以编写 SP
-
Linq 有
Skip(i)和Take(i)。有了它,你就可以分页了。 -
Here 对此有一个答案,您也可以在
Queryable上使用它。但是,您必须对其进行测试,因为它可能会在客户端执行。至于你的实际要求,我认为你不应该做你想做的事。您正在尝试任意下采样,这会导致许多其他问题。正确的做法是对结果进行分页。就性能而言,当您处理这么多行时,这主要取决于数据和索引等的性质,而不是 LINQ。
标签: c# asp.net linq asp.net-web-api