0

我正在使用链接到 Dynamics CRM Online 的网站。我对这两个方面都很陌生,但找到最好的学习方法就是让自己承受压力。

无论如何,我有以下使用 LinqPad 构建的 LINQ 查询:

from m in py3_membershipSet
join c in ContactSet on m.py3_Member.Id equals c.ContactId 
where m.statuscode.Value == 1
orderby m.py3_name
select m

但是,这会导致内存不足异常。如果我使用 Take(100) 它运行正常,但我预计总共有大约 1200 个结果可以检索。我不知道内存问题是否是与 LinqPad 相关的问题,但无论哪种方式,我都假设上述查询不是提取这些结果的最有效方法。

如果它像通过 LinqPad 显示的那样占用内存,我真的可以在提高效率方面提供一些帮助。

4

2 回答 2

1

因为查询不知道后面会需要哪些字段,所以当select子句中只指定实体时,所有列都从实体返回。为了仅指定您将使用的字段,您必须在 select 子句中返回一个新对象,指定您要使用的字段。

所以代替这个:

from m in py3_membershipSet
join c in ContactSet on m.py3_Member.Id equals c.ContactId 
where m.statuscode.Value == 1
orderby m.py3_name
select m

用这个:

from m in py3_membershipSet
join c in ContactSet on m.py3_Member.Id equals c.ContactId 
where m.statuscode.Value == 1
orderby m.py3_name
select new py3_membership()
{
    py3_membershipid = m.py3_membershipid,
    py3_name = m.py3_name
}

查看这篇文章的更多详细信息。

到 Linq 还是不到 Linq

于 2014-08-21T01:11:17.933 回答
1

一个OutOfMemory例外

...当没有足够的内存来继续执行程序时抛出。

因此,我认为您编写的 Linq 并没有什么特别之处——除了它返回的数据超出您的客户所能处理的范围之外。我怀疑这是一个与您的客户有关的问题,而不是 CRM 或 Linq。

这可能与 LinqPad 有关(我自己没有使用过),您是否尝试过从控制台应用程序运行该脚本(以排除任何 LinqPad 问题)?

1200 听起来不是很多数据,我经常毫无问题地检索 1000~ 条记录,但我很高兴检索到更多(5000~)。

分页可能会避免这个问题;使用 LINQ 的页面大型结果集

相关阅读:排除异常:System.OutOfMemoryException

于 2013-04-28T17:36:20.807 回答