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

时间:2012-06-19 14:36:08

标签: asp.net asp.net-mvc-3 linq entity-framework

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

我用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:

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

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

2 个答案:

答案 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); 
    }