LINQ TO SQL查询将csv字段与另一个表字段匹配

时间:2013-01-12 07:23:40

标签: sql-server linq linq-to-sql

我有以下表格

**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查询。我尝试Split,Contains,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

3 个答案:

答案 0 :(得分:0)

如果要在两个表之间建立多对多关系,则应创建第三个表来处理关系。在你的情况下,架构应该是这样的:

    MemberMst                 Member_Hobbie                 HobbiesMst
MemberId   Name           Id   MemberId   HobbiId         HobbyId   Title

Member_Hobbies表中的每条记录都显示特定成员的特定hobbie。

答案 1 :(得分: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-server上转换csv-field。

首先执行内部查询,然后将每个记录从表中加载到客户端。然后它尝试将您的csv-field转换为List<int>值(当数据无法转换时甚至可以抛出异常)。然后它对HobbiesMst表执行连接。总而言之,这不是一个很好的解决方案。

我会建议使用多对多关系表(如Karamafrooz)。

答案 2 :(得分: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
                })