LINQ to Entities无法识别方法(访问非常大的数据库)

时间:2018-01-08 23:18:43

标签: c# asp.net .net entity-framework linq

我有一个包含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以高效的内存方式从数据库中检索和排序数据?

1 个答案:

答案 0 :(得分:1)

对于DateTime,您可以使用EntityFunctions或SqlFunctions,具体取决于版本。

How to Call Database Functions

EntityFunctions

使用ToList()解决问题的方法,你只是在内存中加载所有东西。在使用ToList()之后,您将能够调用常规函数,但是根据数据的大小,它可能成本高且速度慢。

如果您可以管理它,最好在数据库中进行过滤。

另一种选择是使用实际的DateTime向数据库添加第二列。您可以使用旧脚本的SQL脚本执行此操作,并从现在开始将方法更改为两者都保存。