我有一个包含200万条记录的数据库,我必须对它们进行排序并以JSON(WebAPI项目)输出结果。
这是我的代码:
CODE1
var start = Convert.ToDateTime(startdatetime.Split(new[] { ':' }, 2)[0]).Date;
var end = Convert.ToDateTime(enddatetime.Split(new[] { ':' }, 2)[0]).Date;
var result = (from request in db.Requests
where ((Convert.ToDateTime(request.DateTime.Split(new[] { ':' }, 2)[0]).Date >= start)
&&
(Convert.ToDateTime(request.DateTime.Split(new[] { ':' }, 2)[0]).Date <= end))
group request.IP_or_Host by request.IP_or_Host into g
orderby (g.Count()) descending
select g.Key).Distinct().Take(n).ToList();
return result;
此代码抛出错误:
LINQ to Entities无法识别方法
之前就是这样:
CODE2
var start = Convert.ToDateTime(startdatetime.Split(new[] { ':' }, 2)[0]).Date;
var end = Convert.ToDateTime(enddatetime.Split(new[] { ':' }, 2)[0]).Date;
var result = (from request in db.Requests.ToList()
where ((Convert.ToDateTime(request.DateTime.Split(new[] { ':' }, 2)[0]).Date >= start)
&&
(Convert.ToDateTime(request.DateTime.Split(new[] { ':' }, 2)[0]).Date <= end))
group request.IP_or_Host by request.IP_or_Host into g
orderby (g.Count()) descending
select g.Key).Distinct().Take(n).ToList();
return result;
但是如果数据库有太多记录,它会抛出一个outofmemory异常。如何使用LINQ以高效的内存方式从数据库中检索和排序数据?
答案 0 :(得分:1)
对于DateTime,您可以使用EntityFunctions或SqlFunctions,具体取决于版本。
How to Call Database Functions
使用ToList()解决问题的方法,你只是在内存中加载所有东西。在使用ToList()之后,您将能够调用常规函数,但是根据数据的大小,它可能成本高且速度慢。
如果您可以管理它,最好在数据库中进行过滤。
另一种选择是使用实际的DateTime向数据库添加第二列。您可以使用旧脚本的SQL脚本执行此操作,并从现在开始将方法更改为两者都保存。