2009-04-08 52 views
2

我有一個LINQ查詢:子集合不過濾,即使LINQ to SQL中加入存在

var result = from mt in MessageTypes 
      join mtfmt in MessageTypeField_MessageTypes 
       on new { MessageTypeID = mt.ID, MessageTypeFieldID = messageTypeFieldId } equals new { MessageTypeID = mtfmt.MessageTypeID, MessageTypeFieldID = mtfmt.MessageTypeFieldID } 
      where (mt.StatusID == (int)status) 
      select mt; 

或lambda語法,如果你喜歡(我用的那個)(messageTypeFieldID設置從該變種撥打以上PARAM):

var messageTypes = context.MessageTypes 
       .Join(
       context.MessageTypeField_MessageTypes, 
       mt => 
       new 
        { 
         MessageTypeID = mt.ID, 
         MessageTypeFieldID = messageTypeFieldID 
        }, 
       mtfmt => 
       new 
        { 
         MessageTypeID = mtfmt.MessageTypeID, 
         MessageTypeFieldID = mtfmt.MessageTypeFieldID 
        }, 
       (mt, mtfmt) => 
       new 
        { 
         mt = mt, 
         mtfmt = mtfmt 
        } 
       ) 
       .Where(x => (x.mt.StatusID == (int)status)) 
       .Select(x => x.mt); 

我剛開始學習LINQ加入,走近它在新的規範化要求的情況下(多對多)表,我設置了,我想返回所有消息類型每個與他們相關的字段,它位於'MessageTypeField_MessageType'下面。

我「MessageTypeField_MessageTypes」表是一個相當簡單的標準化策略設置這樣而且即使MessageTypeID「有很多」我應該說明它是獨一無二的數據,所以它可能是:

[ID | MessageTypeID | MessageTypeFieldID] 
1 63  10 
1 63  11 
1 63  12 

現在上面的代碼執行並返回一個查詢我很高興..(執行正確的INNER JOIN),但當我看看messageTypes.ToList()[0].MessageTypeField_MessageTypes例如快速觀看,我期望看到1記錄,我得到一整堆messageTypeField_MessageType記錄〜17 ,只有MessageTypeFieldID篩選,而不是MessageTypeID。它應該在每次迭代時按消息類型ID進行過濾,並只返回一條記錄。關於我做錯什麼的想法,或者我如何能夠實現我所需要的?

對不起,這個複雜的例子,但我希望你們可以幫忙!

回答

3

如果您正在查看導航屬性(即某個子集合mt),那麼這與您的查詢無關;這聽起來像你想使用AssociateWith。這在很大程度上取代如果你只是想篩選子數據的加入...

+0

哦,你在開玩笑....哈!我只是在這個複雜的查詢上花了一個小時!謝謝Marc!它現在正是我所需要的,我知道必須有一個更簡單的方法。 – GONeale 2009-04-08 07:27:36

0

考慮更改您的選擇:

select new 
{ 
    MessageType = mt, 
    MessageField = mtfmt 
} 

正如馬克提到,更改查詢是毫無關係的導航屬性。類似於上面的東西可能是你想要的。

如果你想堅持導航屬性,你應該使用AssociateWith和LoadWith的組合。第一個過濾器,第二個過濾器使它成爲一個熱切的負載(所以你不會以多次往返結束)。