过滤 LINQ 组中的 RHS 项目加入

Filter RHS items in LINQ Group Join

在 LINQ 中,我需要使用 some 条件左连接 (group join) 2 个对象列表,这些条件可以表示为等值连接(因此我可以使用On 子句)和其他相关标准。

在 SQL 中,等价物是这样的(使用一个可笑的例子,我们想要为他们拥有的每个人获得一个列表,这些宠物是在主人的结婚日期或之后出生的; 另请注意,我的数据在对象中,而不是在 SQL):

select
  pers.Name, pers.Address, pers.Gender, pet.Name, pet.Species
from person as pers
left join pets as pet on pers.Name=pet.OwnerName and pet.Birthdate >= pers.WeddingDate

这是我目前所知道的 - 这显然不包括列表中的宠物应该在主人的结婚日期或之后出生的限制。

Dim res = (
    From p in Person
    Group Join pt in Pets
    On p.Name Equals pt.OwnerName
    Into PetList = Group
    Select p, PetList)

首先我想我可以使用 Where 子句,但当时列表中的个别宠物不在范围内。

然后我想也许答案是宠物列表中的 lambda 函数,例如

Group Join pt in Pets.Where(Function(pt) pt.Birthdate >= pers.WeddingDate)

但我不知道 (i) 如何让 Person 进入 Lambda 函数作用域,或者 (ii) 如果我这样做了,它是否仍然有效。

所以,我的问题确实是,如何根据非等值连接条件过滤 LINQ Group Join 的右侧结果?

我知道我可以在 Join(例如不是 Group Join)上下文中执行上述某些操作,但我需要 (a) return 没有宠物的人匹配标准,以及 (b) return 每人一件物品,宠物作为清单。

我感觉答案类似于 this,但我对 LINQ 了解不够,无法从中概括。

我在这种情况下采用的方法是在 Select 子句中过滤集合,使用我必须添加到 Pet 模型的函数来专门支持此连接过滤。这当然破坏了 LINQ 的所有优点(即对对象执行任意查询的能力):

Dim res = (
    From p in Person
    Group Join pt In Pets
    On p.Name Equals pt.OwnerName
    Into PetList = Group
    Select p,
            thisPetList = PetList.Where(Function(x) x.MyCustomFunction(p.WeddingDate))
    )

我添加到 Pet 模型的函数接受日期,将其与 Pet 的生日进行比较,returns 如果输入日期早于 Pet.Birthdate,则为真。

呃。