LINQ - IEnumerable.Join on VB.NET中的匿名结果集

时间:2010-05-28 20:59:55

标签: .net vb.net linq

我很久以来就已经有了解决这个问题的方法,但它仍然让我烦恼......它对我对动态LINQ查询的掌​​握仍然很不利。

例如:

有字段( ParentKey,ParentField
儿童包含字段( ChildKey,ParentKey,ChildField
宠物有字段( PetKey,ChildKey,PetField

儿童 Child.ParentKey = Parent.ParentKey
的外键引用> 宠物 Pet.Childkey = Child.ChildKey

上有儿童的外键引用

够简单呃?

假设我有这样的LINQ ......

Dim Q = FROM p in DataContext.Parent _
Join c In DataContext.Child On c.ParentKey = p.ParentKey

将此视为“基本查询”,我将在其上执行其他过滤操作。 现在我想加入 Pet 表,如下所示:

Q = Q.Join(DataContext.Pet, _
Function(a) a.c.ChildKey, _
Function(p As Pet) p.ChildKey, _
Function(a, p As Pet) p.ChildKey = a.c.ChildKey)

以上加入通话无效。我有理解为什么它不起作用,但希望它能告诉你我是如何完成这项任务的。

完成所有这些后,我会附加一个Select来完成这项工作。

有关更好方法的任何想法吗?我用PredicateBuilder试了一下但收效甚微。我可能不知道如何使用它,但感觉它不会处理加入。

1 个答案:

答案 0 :(得分:0)

好吧,为了避免让这个没有答案,继续我的解决方法。

Join无法正常工作,因为编译器会抛出一条狡猾的消息,说在连接的最后一部分中,要么两个参数都必须是强类型的,要么是匿名的。

Function(a, p As Pet) p.ChildKey = a.c.ChildKey) 

自然情况并非如此,因为我之前的查询是匿名的,我正在尝试将其加入到类型化的LINQ类中。

我不能只改变接收查询的变量的类型,因为那时我只能加入我正在选择的类型。就像,如果我想根据宠物选择父母,那么我只能以这种方式进行我的加入,如果我将宠物直接加入父母(至少我的知识),这不可能发生,因为我必须经过孩子去找宠物。

我的解决方案是重新查询同一个变量,并加入匿名类型中的强类型。

Dim q = From anon in q _ 
Join p In DataContext.Pet On p.ChildKey = anon.c.ChildKey

这样,我可以通过追加我喜欢的地方来选择基于宠物的父母:

q = q.Where(Function(v) v.p.PetField = "Fido"

然后选择如下:

q = q.Select(Function(v) v.anon.p)

丑陋吧?但它确实有效。