我有以下表格
**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
Member master中的嗜好是来自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
如果您希望在两个表之间建立多对多关系,则应该创建第三个表来处理该关系。在您的例子中,模式应该是这样的:
MemberMst Member_Hobbie HobbiesMst
MemberId Name Id MemberId HobbiId HobbyId Title
member_爱好表中的每条记录显示了特定成员的特定爱好。
你可以试试这个。
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字段。
内部查询将首先执行,并将中的每条记录从表加载到您的客户端。然后,它尝试将csv字段转换为List<int>
值(当数据无法转换时,甚至会抛出异常)。然后对HobbiesMst
表执行连接。总而言之,这不是一个很好的解决方案。
我建议使用多对多关系表(比如Karamafrooz)。
听起来你是在正确的轨道上,下面应该编译…
var query = MemberMst.SelectMany(
mem => HobbyMst.Where(hob => mem.Contains(hob.HobbyId)),
(mem,hob) => new
{
MemberId = mem.MemberId,
Name = mem.Name,
Title = hob.Title
})