在LINQ Group Join中过滤RHS项目

时间:2015-06-14 04:37:23

标签: vb.net linq left-join

在LINQ中,我需要使用一些标准来加入(group join)2个对象列表,这些标准可以表示为equijoins(所以我可以使用{{1} }子句)和其他相对的标准。

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

On

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

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) 子句,但列表中的个别宠物不在此范围内。

然后我想也许答案是在Pets列表中的lambda函数,类似

Where

但我不知道(i)如何让Person进入Lambda函数范围,或者(ii)如果我这样做,无论如何都会这样做。

所以,我的问题是,如何根据非等值标准过滤LINQ群组加入的右侧结果?

我知道我可以在Group Join pt in Pets.Where(Function(pt) pt.Birthdate >= pers.WeddingDate) (例如不是Join)上下文中执行上述操作,但我需要(a)返回没有符合条件的宠物的人,以及(b)每人返回一个物品,将宠物列为清单。

我觉得答案类似于this,但我不太了解LINQ可以从中推广。

1 个答案:

答案 0 :(得分:0)

我在这种情况下采用的方法是在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.Birthdate,则返回True。

Urgh。