24

阅读这里这里的问题让我对这种情况有了一些了解,而且使用 AsEnumerable 似乎很消耗内存。是否有更好的方法来执行此 LINQ 以及现在执行的方式,得出的数据是否可靠?

删除 AsEnumerable 会导致“本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains 运算符除外。”

var results = from p in pollcards.AsEnumerable()
                          join s in spoils.AsEnumerable() on new { Ocr = p.OCR, fileName = p.PrintFilename } equals new { Ocr = s.seq, fileName = s.inputFileName }
                          where p.Version == null
                          orderby s.fileOrdering, s.seq
                          select new ReportSpoilsEntity
                          {
                              seq = s.seq,
                              fileOrdering = s.fileOrdering,
                              inputFileName = s.inputFileName,
                              Ocr = p.OCR,
                              ElectorName = p.ElectorName
                          };
4

3 回答 3

33

AsEnumerable()实际上是一个强制转换IEnumerable<T>,这使得成员解析找到成员Enumerable而不是Queryable。当您想强制查询的一部分以 SQL(或类似的方式)运行,而其余部分使用 LINQ to Objects 运行时,通常会使用它。

有关更多信息,请参阅我的Edulinq 博客文章。

现在你实际上已经接到了两个电话到AsEnumerable. 我可以看到删除第一个但不删除第二个可能会导致问题,但是您是否尝试过删除两者?

var results = from p in pollcards
              join s in spoils
                 on new { Ocr = p.OCR, fileName = p.PrintFilename } 
                 equals new { Ocr = s.seq, fileName = s.inputFileName }
              where p.Version == null
              orderby s.fileOrdering, s.seq
              select new ReportSpoilsEntity
              {
                  seq = s.seq,
                  fileOrdering = s.fileOrdering,
                  inputFileName = s.inputFileName,
                  Ocr = p.OCR,
                  ElectorName = p.ElectorName
              };
于 2011-03-15T11:32:16.033 回答
6

使用 AsEnumerable 将中断查询并将“外部部分”作为 linq-to-objects 而不是 Linq-to-SQL。实际上,您正在为两个表运行“select * from ...”,然后在客户端执行连接、where 子句过滤、排序和投影。

于 2011-03-15T11:31:09.340 回答
4

AsEnumerable与实体框架一起使用时要小心;如果您的表有大量数据,您的查询可能会很慢,因为查询将首先加载数据,然后应用where子句、排序和投影。

于 2016-11-11T09:01:43.007 回答