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

问题描述 投票:18回答:3

阅读问题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
                          };
c# linq entity enumerable
3个回答
26
投票

AsEnumerable()实际上是对IEnumerable<T>的演员,这使得成员决议找到Enumerable而不是Queryable的成员。它通常在您希望强制部分查询以SQL(或类似)运行时使用,而其余部分则使用LINQ to Objects运行。

有关更多信息,请参阅我的Edulinq blog post on it

现在你实际上有两次打电话给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
              };

5
投票

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


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.