2013-01-12 38 views
0

我有如下表LINQ to SQL查詢到CSV場匹配到另一臺場

**MemberMst** 
MemberID Name  Hobbies 
1  Ronak  1,3,4 
2  Kapil  2,4 

**HobbiesMst** 
HobbyId Title 
1   Computer Game 
2   Cricket 
3   Skating 
4   Basket Ball 

嗜好會員主從HobbiesMst值。現在我想從HobbiesMst成員的愛好。使用linq查詢。我嘗試拆分,包含,SelectMany但未能編譯。

所以我很困惑如何做到這種情況下的多對多關係。

i want below output. 
============================================== 
MemberId Name  Title 
1  Ronak Computer Game 
1  Ronak Skating 
1  Ronak Basket Ball 
2  Kapil Cricket 
2  Kapil Basket Ball 
+0

所以,你有3個表,對不對?如果是,告訴你什麼輸出你exexly想要 – Karamafrooz

+0

不,我沒有三張桌子,我只有兩張桌子,我想加入這兩張桌子,但我有兩個側面的多個值。 – Ronak

回答

0

如果你想在兩個表之間有多對多的關係,你應該創建第三個表來處理關係。你的情況的模式是對子級這樣的:

MemberMst     Member_Hobbie     HobbiesMst 
MemberId Name   Id MemberId HobbiId   HobbyId Title 

在Member_Hobbies表中的每個記錄顯示特定成員的具體霍。

+0

我欣賞你的觀點,但現在不可能。因爲即時升級舊系統。是否有任何選項可以在LINQ中實現這一點,我已經完成了SQL。 – Ronak

0

你可以試試這個。

var result = from record in 
       (
        from transform in MemberMst.AsEnumerable() 
        select new 
        { 
         MemberId = transform.MemberId, 
         Name = transform.Name, 
         Hobbies = transform.Hobbies 
              .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) 
              .Select(item => Convert.ToInt32(item)) 
              .ToList() 

        } 
       ) 
      from hobby in HobbiesMst 
      where record.Hobbies.Contains(hobby.HobbyId) 
      select new 
      { 
       record.MemberId, 
       record.Name, 
       hobby.Title 
      }; 

不幸的是,我不確定這是否可行。但你可以嘗試在客戶端而不是在sql服務器上轉換你的csv字段。

內部查詢將首先執行,並將記錄從表中加載到您的客戶端。然後它會嘗試將您的csv字段轉換爲List<int>值(甚至在數據無法轉換時甚至會拋出異常)。然後它對HobbiesMst表執行連接。總而言之,這不是一個很好的解決方案。

我會推薦一個多對多的關係表(像卡拉馬弗羅茲)。

0

聽起來你是在正確的軌道上,下面應編譯...

var query = MemberMst.SelectMany(
       mem => HobbyMst.Where(hob => mem.Contains(hob.HobbyId)), 
       (mem,hob) => new 
       { 
       MemberId = mem.MemberId, 
       Name = mem.Name, 
       Title = hob.Title 
       })