2

次のようなデータベースがあります。

tbl_Seminar
   ID
   isActive


tbl_SeminarFees
   ID
   seminar_id -- foreign key
   fee_text

アクティブなすべてのセミナー (isActive ==1) と、そのセミナーに関連する料金のリストを取得したいと考えています。各セミナーは、その料金である tbl_SeminarFees に n レコードを持つことができます。このようなオブジェクトのリストを返す linq 構造を返すことができますが{seminar, SeminarFee}、次のようなネストされた構造を作成したかったのです。

{seminar, List<SeminarFee>}

私のlinqクエリはどのように見えるべきですか?

ここに私のlinqがあります:

var results = from s in context.Seminar
              join p in context.SeminarFees on
              s.ID equals p.SeminarID

              where s.IsActive == 1
              select new 
              {
                  Seminar = s,
                  Fees = p

              };

これらのリストを取得するためにこれを変更するにはどうすればよいですか:{seminar, List<SeminarFee>}

ありがとう

アップデート

@lazyberezovsky は、グループ結合を別の変数に使用する良いアイデアを教えてくれました。しかし、結果セットをループするにはどうすればよいでしょうか。これが私が今持っているものです:

foreach (var seminarAndItsFeesObject in results)
            {
                //do something with the seminar object 
                //do something with the list of fees
            }

ただし、これにより次のエラーが発生します。

    Argument type 'SeminarFees' does not match the 
corresponding member type 
'System.Collections.Generic.IEnumerable`1[SeminarFees]'

私は何を間違っていますか?

ありがとう

4

2 に答える 2

6

キーの等価性に基づいて内部シーケンス項目をグループ化する group join (別名join..into )使用して、セミナーに関連するすべての料金を取得できます。

var results = from s in context.Seminar
              join f in context.SeminarFees on
                   s.ID equals f.SeminarID into fees // here 
              where s.IsActive == 1
              select new 
              {
                  Seminar = s,
                  Fees = fees
              };

ToList()サーバー側で呼び出すことはできません。ただし、後でクライアントに結果をマッピングできます。


ところで、オブジェクトのナビゲーション プロパティ Feesを定義できます。Seminar

public virtual ICollection<SeminarFee> Fees { get; set; }

この場合、有料のセミナーを読み込むことができます。

var results = context.Seminar.Include(s => s.Fees) // eager loading
                     .Where(s => s.IsActive == 1);
于 2013-06-16T21:29:51.130 に答える
1
  var results = from s in context.Seminar
                join p in context.SeminarFees on s.ID equals p.SeminarID
                where s.IsActive == 1
                group p by s into grouped
                select new {
                  Seminar = grouped.Key,
                  Fees = grouped.ToList()
                };
于 2013-06-16T21:35:07.087 に答える