我无法确定如何根据多对多关系中的列表进行选择。
我用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; }
}
在我的代码中,我的控制器将收到一个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);
}
这适用于抓住任何Bar:
我非常肯定有更好的方法可以做到这一点,是否有一种方法可以根据列表进行选择而不是进行2次foreach循环?
我不知道如何获得一个Foo列表,其中Foo拥有所有的条形而不仅仅是任何条形。
答案 0 :(得分:7)
删除FooBar类。
只需在Bar类
中创建public virtual ICollection<Foo> Foos {get;set;}
即可
和你的Foo类中的public virtual ICollection<Bar> Bars {get;set;}
这将创建多对多的关系(在你的数据库中有一个名为[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)));
不确定我是否理解“仅”和“任何”,但如果您对其他查询有疑问...请询问。
答案 1 :(得分:0)
未经测试,但看起来你只需要在这里加入...加入所有加入Foos的FooBars的所有酒吧,对吧?
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);
}