阅读问题here和here让我对这种情况有所了解,似乎使用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
};
答案 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
子句,排序和投影。