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