2011-03-15 89 views
13

阅读问题herehere给了我一些洞察情况,并且它似乎使用AsEnumerable是内存消耗。有没有更好的方法来做到这一点LINQ和现在的做法是,出来的数据是可靠的吗?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 
          }; 

回答

24

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

我删除了两个AsEnumerables时,我提到了错误。 (我没有试过只删除一个)。战利品和pollcards本身就是LINQ语句吗? (一个IQueryable 和一个Collection ) – Andy 2011-03-15 11:39:25

+1

@Andy:是的,事实上'spoils'是一个内存中的集合,这绝对是相关的。我认为这是另一个数据库查询。我不知道有什么方法可以将数据库中的一半数据加入进来。 “原本”来自数据库吗? – 2011-03-15 11:42:02

+0

战利品是由2个querrys创建的,其中一个为上一个10的tops10,另一个为结果进行联合,然后通过该联盟填充集合。我不知道为什么我们不返回工会并将其从Iqueryable转换为集合。 (将返回IQuerryable解决对AsEnumerables的需求?) – Andy 2011-03-15 11:47:43

5

使用AsEnumerable将折断的查询,并做了“外面的部分”作为LINQ到对象,而不是LINQ到SQL。实际上,您为两个表格运行“select * from ...”,然后执行连接,where子句筛选,排序和投影客户端。

1

在实体框架中使用AsEnumerable时要小心。如果你的表有很多的数据,你的查询变得很慢,因为查询第一个加载数据和应用where子句,排序和投影。

相关问题