0

私は以下のテーブルを持っています

**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
4

3 に答える 3

0

2 つのテーブル間に多対多の関係を持たせたい場合は、関係を処理するために 3 番目のテーブルを作成する必要があります。あなたの場合、スキーマは次のようになります:

    MemberMst                 Member_Hobbie                 HobbiesMst
MemberId   Name           Id   MemberId   HobbiId         HobbyId   Title

Member_Hobbies テーブルの各レコードは、特定のメンバーの特定の趣味を示しています。

于 2013-01-12T10:06:11.923 に答える
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-field を値に変換しようとしList<int>ます (データを変換できない場合に例外をスローすることさえあります)。次に、テーブルに対して結合を実行しHobbiesMstます。全体として、あまり良い解決策ではありません。

代わりに、多対多のリレーション テーブルをお勧めします (Karmafrooz など)。

于 2013-01-12T12:30:03.807 に答える
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
                })
于 2013-01-12T12:36:22.100 に答える