4

假设我们有:

public class Foo
{
    public long Id { get; set; }
    public string Name { get; set; }
    public ICollection<Bar> { get; set; }
}

public class Bar
{
    public long Id { get; set; }
    public int Age { get; set; }

    public virtual Foo { get; set; }
    public long FooId  { get; set; }
}

我们的数据可能看起来像这样:(假设List<Foo>

// Forget the syntax, just to demonstrate data
foo[0] = new Foo{ Id = 1, Name = "A", Bar = { collection of Bars with Ages over 10 }};
foo[1] = new Foo{ Id = 2, Name = "B", Bar = { collection of Bars with Ages over 20 }};
foo[2] = new Foo{ Id = 3, Name = "C", Bar = { collection of Bars with Ages under 10 }};

现在,假设我想要所有这些Foos,但他们Bar的 s 仅包括Bar年龄在 5-25 之间的 a。

对于这样的事情,我会反向工作并获取所有 Bars,然后将所有关联的 Foos 获取到这些 bar,并将 Bars 重新映射回 Foo。似乎过于复杂。

更清楚一点 -所有的 Foos 都只有 5 到 25 岁的酒吧:)

4

3 回答 3

4

如果你想选择所有Foo的,并且只选择他们Bar在 5 到 25 岁之间的:

var results = 
    from f in db.Foos
    select new
    {
        f.Id,
        f.Name,
        Bars = f.Bars.Where(b => b.Age >= 5 && b.Age <= 25)
    };

这将产生一个匿名类型作为结果。如果您需要创建一个命名类型(例如,如果您需要将函数的结果作为 a 返回List<T>),您可能应该为此结果集创建一个简单的命名类型:

public class FooWithFilteredBarResult // replace with whatever name you like
{
    public long Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Bar> { get; set; }
}


List<FooWithFilteredBarResult> results = 
    (from f in db.Foos
     select new FooWithFilteredBarResult 
     {
         Id = f.Id,
         Name = f.Name,
         Bars = f.Bars.Where(b => b.Age >= 5 && b.Age <= 25)
     })
    .ToList();
于 2013-08-09T01:38:13.043 回答
1
var r = Foos.Select(x => new Foo()
        {
            Id = x.Id,
            Name = x.Name,
            Bars = x.Bars.Where(y => y.Age <= 25 && y.Age >= 5).ToList()
        });
于 2013-08-09T01:37:51.853 回答
1

这也只会选择唯一的 Foo。

bars.Where(b => b.Age >= 5 && b.Age <= 25).GroupBy(b => b.FooId).Select(g => g.FirstOrDefault().Foo).ToList();
于 2013-08-09T01:38:44.763 回答