C# LinQ方法语法有.where()和无连接的多个表

C# LinQ方法语法有.where()和无连接的多个表,c#,asp.net,linq,lambda,entity-framework-5,C#,Asp.net,Linq,Lambda,Entity Framework 5,如何使用方法语法从多个表中提取数据,而不使用联接,而只使用.where()方法 我正在对EF5 db上下文进行选择,该上下文映射到这个遗留表结构,其中我有一个person detail表和另一个表,该表引用自身来创建层次结构,并以这种方式引用person details表: PersonSet .Where(p => p.LastName.ToLower()=="surname") .Join(SubsetSet, p => p.Id, ss => ss.SubsetLink

如何使用方法语法从多个表中提取数据,而不使用联接,而只使用.where()方法

我正在对EF5 db上下文进行选择,该上下文映射到这个遗留表结构,其中我有一个person detail表和另一个表,该表引用自身来创建层次结构,并以这种方式引用person details表:

PersonSet 
.Where(p => p.LastName.ToLower()=="surname")
.Join(SubsetSet, p => p.Id, ss => ss.SubsetLink, (p, ss) => new { PersonDetail = p, person = ss })
.Where(m => m.person.Frame=="a" && m.person.Purpose=="1")
.Join(SubsetSet, ss1 => ss1.person.Owner, person => person.SubsetLink, (ss1, ss2) => new { person = ss1, club = ss2 })
.Where(a => a.club.Frame=="b" && a.club.Purpose=="2")
.Join(SubsetSet, ss => ss.club.Owner, ss2 => ss2.SubsetLink, (ss, ss2) => new { club = ss, association = ss2 })
.Where(a => a.association.Frame=="b" && a.association.Purpose=="3")
.Join(SubsetSet, ss => ss.association.Owner, ss3 => ss3.SubsetLink, (ss, ss3) => new { association = ss, district = ss3})
.Where(d => d.district.Frame=="b" && d.district.Purpose=="4" && d.district.SubsetLink=="12345")
.Select(proj => new { proj.association.club.person, proj.association.club, proj.association, proj.district })
.OrderByDescending(a => a.association.club.person.phyperson.FirstName) 
.Take(10).Dump();
上面的查询至少在LinqPad中有效,但是,在我看来,如果我能去掉这些连接,语句看起来可能会更好。现在我知道,就像下面的Albahari示例一样,这可以通过查询语法来完成。但我找不到一个用方法语法来说明这种情况的例子。我尝试的方法当然可能是错误的,这就是为什么我找不到合适的例子

在这里,我发现了一些类似的东西,但无法在LinQPad中使用:

或者这一个,解决方案也是查询语法:

或者Albahari的例子:()

考虑这个查询:

var q = from order in orders
        from orderline in order.Lines
        where orderline.Count > 10
        select order.Discount * orderline.Price;
这或多或少与

var q = orders
    .SelectMany(order => order.Lines, (order, orderline) => new { order, orderline})
    .Where(item => item.orderline.Count > 10)
    .Select(item => item.order.Discount * item.orderline.Price);
var q = orders
    .SelectMany(order => orderLines, (order, orderline) => new { order, orderline})
    .Where(item => item.orderline.OrderId == item.order.Id)
    .Where(item => item.orderline.Count > 10)
    .Select(item => item.order.Discount * item.orderline.Price);
有关
SelectMany
的更多信息,请参阅

如果未定义关联,请执行以下操作:

var q = from order in orders
        from orderline in orderLines
        where orderline.OrderId == order.Id
        where orderline.Count > 10
        select order.Discount * orderline.Price;
这或多或少与

var q = orders
    .SelectMany(order => order.Lines, (order, orderline) => new { order, orderline})
    .Where(item => item.orderline.Count > 10)
    .Select(item => item.order.Discount * item.orderline.Price);
var q = orders
    .SelectMany(order => orderLines, (order, orderline) => new { order, orderline})
    .Where(item => item.orderline.OrderId == item.order.Id)
    .Where(item => item.orderline.Count > 10)
    .Select(item => item.order.Discount * item.orderline.Price);

通常每个实体都有一个连接到另一个实体的连接属性,即在上面的Albahari示例中,
购买
有一个
客户
,该客户链接到购买该购买的特定客户。您的实体是否具有这些属性?在ALbahri示例中是导航属性Customer和PurchaseItems。如果您的实体具有导航属性,则不应使用join将它们与您的实体链接。@NedStoyanov啊,我只有这两个实体,在edmx中没有定义它们之间的关联。原始数据库没有关系。这两个表/实体之间的链接键字段的类型不同。所以我不能参加这个协会。此外,自引用子集合有五个键,它们相互引用(所有者到子链接),如我的示例代码所示。所以我想如果没有连接就做不到?我是这么说的,我看不到任何其他的方法来做我想如果我在实体之间定义了关联,这可能是答案。但由于我没有这样做,我将不得不使用我已有的原始方法。无论如何谢谢你@Lupa更新了答案,使其更清楚地表明,在未定义关联的情况下也可以使用此技术。