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 的 Bar (包括 only 和 with 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);
}

但是,这适用于抓取任何 Bar:

  1. 我很肯定有一种更好的方法可以做到这一点,有没有一种方法可以根据列表进行选择,而不是进行大约 2 个 foreach 循环?

  2. 我不确定如何获取 Foo 的列表,其中 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)));

不确定我是否理解“唯一”和“任何”,但如果您对其他查询有疑问......请问。

于 2012-06-19T15:07:42.550 回答
0

未经测试,但看起来您只需要在这里加入...加入所有 FooBar 中的所有 Bar,加入到传入的 Foos 中,对吗?

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 回答