我如何使用 LINQ Select 一个超过 2 个表的 IEnumerable

How can I Select an IEnumerable over 2 Tables using LINQ

给定 3 个业务对象:

public class A 
{
    public long Id { get; set; } 
}

public class B
{
    public long ClassCId { get; set; }
    public string ClassBFirstString { get; set; }
}

public class C
{              
    public long Id { get; set; }           
    public long ClassAId { get; set; }
}

和一个方法:

public IEnumerable<A> GetAllAbyClassBFirstStringFunction(string strg)
{

}

我想 select A 的所有对象都使用 LINQ 在对象 C 和 Class B 的字符串(ClassBFirstString) 等于方法参数 (strg).

我可以使用 2 个入口点

第一个是一个 IEQueryable<A> 拥有 A 的所有对象我们称它为 _allObjectsOfA

第二个是一个 IEQuaryable<B> 拥有 B 的所有对象我们称它为 _allObjetsOfB

根据上面的方法如何做到这一点?

鉴于此模型:

List<A> ListOfA = new List<A>()
{
    new A { Id = 1 }, new A { Id = 2 }, new A { Id = 3 }
};

List<B> ListOfB = new List<B>()
{
    new B { ClassCId = 10, ClassBFirstString = "a"},
    new B { ClassCId = 11, ClassBFirstString = "b"},
    new B { ClassCId = 12, ClassBFirstString = "c"}
};

List<C> ListOfC = new List<C>()
{
    new C { Id = 10, ClassAId = 1},
    new C { Id = 11, ClassAId = 1},
    new C { Id = 11, ClassAId = 3},
    new C { Id = 12, ClassAId = 3}
};

此方法的实现 IEnumerable<A> GetAllAbyClassBFirstStringFunction:

public static IEnumerable<A> GetAllAbyClassBFirstStringFunction(string strg)
{
    var q = from a in ListOfA
            join c in ListOfC on a.Id equals c.ClassAId
            join b in ListOfB on c.Id equals b.ClassCId
            where b.ClassBFirstString == strg
            select a;

    return q;
}

像这样调用时:

var q = GetAllAbyClassBFirstStringFunction("b");

return 结果如下:

[0] = {ConsoleApplication1.A}Id = 1

[1] = {ConsoleApplication1.A}Id = 3