AsEnumerable()对LINQ实体的影响是什么?

时间:2011-03-15 11:28:19

标签: c# linq entity enumerable

阅读问题herehere让我对这种情况有所了解,似乎使用AsEnumerable是内存消耗。有没有更好的方法来实现这个LINQ以及现在的方式,数据是否可靠?

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

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
                          };

3 个答案:

答案 0 :(得分:27)

AsEnumerable() 有效地转换为IEnumerable<T>,这使得成员解析会找到Enumerable而非Queryable的成员。它通常在您希望强制部分查询以SQL(或类似)运行时使用,其余部分使用LINQ to Objects运行。

有关详细信息,请参阅我的Edulinq blog post on it

现在你实际上已经有{em>两个调用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
              };

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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