0

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

无论如何,我有,我已经使用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一样显示内存的话。

回答

1

An OutOfMemory exception

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

所以我不认为这是什么特别与你写的Linq - 除了它返回的数据比客户端可以应付更多。我怀疑这是一个与CRM或Linq相关的问题。

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

1200听起来不像很糟糕的数据,我经常检索1000〜记录没有问题,但我愉快地检索更多(5000〜)。

寻呼可能会避免该问题; Page Large Result Sets with LINQ

相关阅读:Troubleshooting Exceptions: System.OutOfMemoryException

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 
} 

退房这个职位的更多细节。

To Linq or not to Linq