我有以下表格
**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
答案 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
})