我是来自MS Access背景的VB.Net新手。我正在开发一个使用带有SQL后端的linq的程序。联系人有一个数据上下文。
也许这个插图会澄清。这是传给我的:
联系人表格:
ContactID (PK)
a_ContactTypes表:
ContactTypeID (PK)
ContactType
ContactTypes联结表:
ContactTypeID (PK)
aContactTypeID
ContactID
假设我在Contacts
表中有以下项目:
ContactID
---------
Contact1
Contact2
Contact3
a _ ContactTypes
表中的以下项目:
ContactTypeID ContactType
------------- -----------
Type1 Business
Type2 Private
这就是ContactTypes联结表的样子:
ContactTypeID ContactID aContactTypeID
------------- --------- --------------
1 Contact1 Type1
2 Contact1 Type2
3 Contact3 Type2
因此Contact1
有联系类型Private
和Business
,Contact2
没有联系类型,Contact3
只有联系类型Private
。 (ContactTypeID
意味着两个表中的两个不同的东西有点令人困惑,但这是我交出的很多,并且有轻微的不便)
我能够进入网格的内容如下:Linq:
Contact1 Business
Contact1 Private
Contact2
Contact3 Private
我想与Linq进入网格的是:
ID Business Private
-------- -------- -------
Contact1 True True
Contact2 False False
Contact3 False True
所以我只是简单地创建一堆Contact对象并使用for循环来填充联系人类型,或者在linq查询本身中有一个很好的,简洁的方法吗?
免责声明:我重申我正在从主要的MS Access VBA背景转变,因此我的术语(以及整体知识)可能会被取消。我已经搜索过,但似乎没有任何东西适合我想要做的事情,但我可能正在搜索没有正确的术语(和整体知识)。我也尝试将示例放入列表中,但看起来我没有正确应用星号。
答案 0 :(得分:0)
查看此代码(Sourced from here)和converted。您可以使用它:
Imports System
Imports System.Collections.Generic
Imports System.Linq
Namespace ReflectionIT.Training
Public NotInheritable Class LinqExtenions
Private Sub New()
End Sub
<System.Runtime.CompilerServices.Extension> _
Public Shared Function Pivot(Of TSource, TFirstKey, TSecondKey, TValue)(source As IEnumerable(Of TSource), firstKeySelector As Func(Of TSource, TFirstKey), secondKeySelector As Func(Of TSource, TSecondKey), aggregate As Func(Of IEnumerable(Of TSource), TValue)) As Dictionary(Of TFirstKey, Dictionary(Of TSecondKey, TValue))
Dim retVal = New Dictionary(Of TFirstKey, Dictionary(Of TSecondKey, TValue))()
Dim l = source.ToLookup(firstKeySelector)
For Each item As var In l
Dim dict = New Dictionary(Of TSecondKey, TValue)()
retVal.Add(item.Key, dict)
Dim subdict = item.ToLookup(secondKeySelector)
For Each subitem As var In subdict
dict.Add(subitem.Key, aggregate(subitem))
Next
Next
Return retVal
End Function
End Class
End Namespace