3

多対多の関係でリストに基づいて選択する方法がわかりません。

エンティティ フレームワークを使用して、次のエンティティと多対多の関係を作成しました (これが間違っている場合は修正してください)。

public class Foo {
  public int FooID { get; set; }
  public string FooName { get; set; }
  public virtual ICollection<FooBar> Foo_Bar { get; set; }
}

public class Bar {
  public int BarID { get; set; }
  public string BarName { get; set; }
  public virtual ICollection<FooBar> Foo_Bar { get; set; }
}

public class FooBar {
  public int FooBarID{ get; set; }
  public virtual int BarID { get; set; }
  public virtual int FooID { get; set; }
}

私のコードでは、コントローラーは Foo のリストを受け取り、それらの foo を含むすべてのバーを見つける必要があります ( only と any の両方で)

私は本当にどこから始めるべきか途方に暮れています...これが私が思いついたすべてです:

public PartialViewResult SearchAnyBar(List<Foo> foos) {
    List<FooBar> foobars = _db.FooBar.Select(fb => fb).ToList<FooBar>();
    List<Bar> searchedBars = new List<Bar>();

    foreach (Foo f in foos)
    {
        foreach (FooBar fXb in foobars) 
        {
            if (fXb.FooID == f.FooID)
            {
                searchedBars.Add(_db.Bar.Where(b => b.BarID == fXb.BarID).FirstOrDefault());
            }
        }
    }        

    return PartialView("The View", searchBars);
}

ただし、これは任意のバーを取得する場合に機能します。

  1. これを行うにはもっと良い方法があると確信しています.2つの foreach ループの代わりに、リストに基づいて選択する方法はありますか?

  2. Foo に ANY だけでなく、すべての Bar がある Foo のリストを取得する方法がわかりません。

4

2 に答える 2

7

FooBar クラスを削除します。

public virtual ICollection<Foo> Foos {get;set;}Bar クラスを作成するだけです

そしてpublic virtual ICollection<Bar> Bars {get;set;}あなたのFooクラスの

これにより、多対多のリレーションシップが作成されます ([Foo-Bar] という名前のリレーション テーブルまたはデータベース内のそのようなものを使用して... しかし、気にしないでください。オブジェクトを使用することになります)。

それから

任意のクエリ:

var listOfFooId = <a list of Foo>.Select(m => m.FooId).ToList;
return _db.Bar.Where(m => m.Foos.Any(x => listOfFooId.Contains(x.FooId)));

"only" と "any" をよく理解できていませんが、他のクエリに問題がある場合は... 質問してください。

于 2012-06-19T15:07:42.550 に答える
0

テストされていませんが、ここで参加する必要があるようです... 渡された Foos に参加しているすべての FooBars のすべての Bars に参加していますよね?

public PartialViewResult SearchAnyBar(List<Foo> foos) { 

    var bars = (from f in foos
               join fb in _db.FooBars on f.Id equals fb.FooId
               join b in _db.Bars on fb.BarId equals b.BarId
               select b).ToList();



        return PartialView("The View", bars); 
    } 
于 2012-06-19T14:48:12.683 に答える