我想簡化一個包含多個包含的linq查詢。如何將包含多個Linq請求的因子分解?
我的模式很簡單:一個網站鏈接到一個合同,鏈接到一個客戶。在那個客戶端,我需要得到一個請求電話,郵件和敬語(appelRef)。
我想,因爲後面的請求是由實體框架轉換成SQL服務器請求一個請求。
這裏是LINQ請求:
var search =
from IMT.Site s in imtContext.IMTObjects.OfType<IMT.Site>()
.Include(
s => s.LienContratSiteRef
.Select(l => l.Contrat)
.Select(c => c.LienContratClientRef
.Select(l => l.Client)
.Select(cl => cl.Telephones)))
.Include(s => s.LienContratSiteRef
.Select(l => l.Contrat)
.Select(c => c.LienContratClientRef
.Select(l => l.Client)
.Select(cl => cl.Mails)))
.Include(s => s.LienContratSiteRef
.Select(l => l.Contrat)
.Select(c => c.LienContratClientRef
.Select(l => l.Client)
.Select(cl => cl.AppelRef)))
where s.Reference.ToString() == siteId
select s;
尤爾可以注意到塊
.Include(
s => s.LienContratSiteRef
.Select(l => l.Contrat)
.Select(c => c.LienContratClientRef
.Select(l => l.Client)
..是重複三次。它是否可以將該代碼塊分解?
更新:有intermedray對象LienContratSiteRef和LienContratClientRef和關係是0 - *,所以LienContratSiteRef.Contrat和LienContratClientRef.Client是集合。
我也試過:
.Include(
s => s.LienContratSiteRef
.Select(l => l.Contrat)
.Select(c => c.LienContratClientRef
.Select(l => l.Client)
.Select(cl => new { Tels = cl.Telephones, Mail = cl.Mails, Appel = cl.AppelRef})))
,但它導致了運行時錯誤:
The Include path expression must refer to a navigation property defined on the type.
你可以做到這一點,但這需要構建包括手動的表達,這可能導致在相當長的一段代碼(雖然這代碼可能在以後類似的情況下重複使用我想)。 – Evk