在 LINQ 中,我需要使用一些能够表示为等接的标准(因此我可以使用 On
子句)和其他相对条件来左连接 ( group join
) 2 个对象列表。
等价物是这样的(使用一个荒谬的例子,我们想为每个人的宠物获取一个列表,这些宠物是在主人的婚礼日期或之后出生的;还要注意,我的数据在对象中,而不是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 组联接的右侧结果?
我知道我可以在Join
(例如不是Group Join
)的上下文中执行上述一些操作,但我需要 (a) 返回没有符合标准的宠物的人,以及 (b) 每人返回一个对象,将宠物作为列表。
我有一种感觉,答案是这样的,但我对 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.Birthdate,则返回 True。
呃。