LINQ:有很多关系,请从列表中选择

Gre*_*g B 3 linq asp.net entity-framework asp.net-mvc-3

我无法确定如何根据多对多关系中的列表进行选择.

我用entity-framework创建了以下实体和多对多关系(请纠正我,如果我这样做错了):

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; }
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我的控制器将收到一个Foo列表,我需要找到所有带有那些foo的Bar(只有和任何一个)

我真的不知道从哪里开始...这就是我想出来的全部内容:

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);
}
Run Code Online (Sandbox Code Playgroud)

这适用于抓住任何Bar但是:

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

  2. 我不知道如何获得一个Foo列表,其中Foo拥有所有的条形而不仅仅是任何条形图.

Rap*_*aus 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)));
Run Code Online (Sandbox Code Playgroud)

不确定我理解"唯一"和"任何",但如果你有其他查询的问题...问.