2014-10-17 95 views
0

我想知道如何有效計數(SQL服務器端)具有多個相關實體的特定範圍的結果的不同計數的數量到很多關係。高效計算EF中多對多關係實體的方法

這是目前的情況中實體框架:

表1 1 < ------->∞表2

表2∞< ------->∞表4

表2和表4具有多對多關係,並與SQL中的Table3鏈接。 我想要的是與Table1的特定範圍相關的table4結果的不同計數。

在LINQ to SQL查詢是這樣的:

(from dc in Table1 
join vc in Table2 on dc.Table1Id equals vc.Table2Id 
join vcac in Table3 on vc.Table2Id equals vcac.Table3Id 
           join ac in Table4 on vcac.Table3Id equals ac.Table4Id 
           where dc.Table1Id > 200000 
           group ac by ac.Table4Id into nieuw 
           select new { acid= nieuw.Key}).Count() 

這讓SQL服務器直接返回計數。 由於多對多關係(表3)的額外表已消失,因此在查詢語法中將此查詢轉換爲L2E時出現問題。 (因爲我不能通過內部連接將表4連接到表2)。

我有這種鏈式語法,但是,這是有效的(這是否獲取整個列表,或它是否讓SQLserver做計數,因爲我不知道這是一種有效的方式來選擇,表2包含約收3萬詞條,我不希望它取這個結果只是來算的話):

context.Table4.Where(a => a.Table2.Any(v => v.Table1Id > 200000)).Select(a => aTable4Id).Distinct().Count(); 

我將如何去轉換LINQ2SQL查詢到L2E在查詢語法?或者在這種情況下鏈接的語法很好?

+0

導航屬性在哪裏? ('Table1.Table2s'等) – 2014-10-17 11:38:57

+0

在EF: Table1.Table2 Table2.Table4 Table2.Table1 Table4.Table2 Table4.Table4 – snovvdog 2014-10-17 12:02:01

+0

在'join'代替所以使用這些。 – 2014-10-17 12:53:19

回答

0

.Select()方法uses deferred execution,這意味着它不會真正運行查詢,直到您需要結果。在鏈中的那一點,它仍然只存在於查詢定義中。然後在.Count()之前用.Distinct()修改 - 它使用SQL GROUP BY語句來查詢數據庫。所以你應該很好。