关于c#:AsEnumerable()对LINQ实体的影响是什么?

What is the effect of AsEnumerable() on a LINQ Entity?

阅读这里和这里的问题让我对这种情况有了一些了解,而且使用无数似乎是在消耗记忆。有没有更好的方法来完成这个LINQ,现在的方法,得到的数据是否可靠?

删除"本地序列不能用于查询运算符的Linq to SQL实现中,但包含运算符除外。"

1
2
3
4
5
6
7
8
9
10
11
12
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
                          };

AsEnumerable()实际上是对IEnumerable的强制执行,这使得成员决议找到Enumerable的成员而不是Queryable的成员。它通常在您希望强制查询的一部分以SQL(或类似的)形式运行时使用,而其余部分则使用LinqTo对象运行时使用。

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

现在你实际上有两个电话打给AsEnumerable。我知道移除第一个而不是第二个会导致问题,但您是否尝试移除这两个?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
              };


使用asenumerable将中断查询,并将"外部部分"作为对象的LINQ而不是SQL的LINQ。实际上,您正在为两个表运行"select*from…",然后执行联接、where子句筛选、排序和投影客户端。


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