我正在学习LINQ,使用LINQPAD进行测试,并且在JOINing中遇到了我无法解释的错误。我已经搜索了这个论坛,我能找到的最接近的答案是,我加入的密钥不是相同的数据类型,但我绝对可以保证它们是(他们&#39 ;两个GUID)。
这是失败的代码,虽然在线参考和教程告诉我我正在写这个:
var Table1 = (from fis in FinancialInstitutionExaminers
select fis.InvitedByID).Distinct();
var Table2 = (from c in Contacts
select new {c.ID, c.FirstName, c.LastName });
var JoinedTables2 = Table1.Join(Table2,
k1 => k1.InvitedByID, // This causes failure
k2 => k2.ID,
(k1, k2) =>
new {
//ConID = k1.InvitedByID,
ConFirstName = k2.FirstName,
ConLastName = k2.LastName
});
JoinedTables2.Dump();
问题在于 k1 =>行k1.InvitedByID 即可。当我指定列" InvitedByID 时,"我收到了错误" CS1061' Guid'不包含' InvitedByID'的定义。
InvitedByID 确实存在于我的数据源中,它与我加入的列的类型相同(ID,由我的联接中的k2 => k2.ID指定)。两列都是GUID。
这是什么引起了我的兴趣。如果我修改如下代码,从k1 =>中删除InvitedBy k1.InvitedBy,代码有效。这令我感到困惑。我不明白(1)为什么我不能在连接中明确使用列名,以及(2)代码如何在没有它的情况下工作(我可以看到LINQ如何可以推断它应该加入为Table1选择的唯一列,但同样,如果它对该列的数据类型没有问题,为什么我不能明确地命名它?)
这有效:
var Table1 = (from fis in FinancialInstitutionExaminers
select fis.InvitedByID).Distinct();
var Table2 = (from c in Contacts
select new {c.ID, c.FirstName, c.LastName });
var JoinedTables2 = Table1.Join(Table2,
k1 => k1, // Note I removed InvitedBy
k2 => k2.ID,
(k1, k2) =>
new {
//ConID = k1.InvitedByID,
ConFirstName = k2.FirstName,
ConLastName = k2.LastName
});
JoinedTables2.Dump();
答案 0 :(得分:1)
您正在投影(使用select
)错误。您似乎正在尝试访问InvitedByID
中任何类型T
的对象的属性IEnumerable<T> FinancialInstitutionExaminers
(使用您使用的任何类型填写此T
,因为我看不到那部分代码)。该属性返回GUID
。因此,Table1属于IEnumerable<GUID>
类型,而不属于IEnumerable<T>
类型。虽然var
可能有用,但过度使用通常会导致这些错误。
尝试:
var Table1 = FinancialInstitutionExaminers.Distinct();
var Table2 = (from c in Contacts
select new {c.ID, c.FirstName, c.LastName });
var JoinedTables2 = Table1.Join(Table2,
k1 => k1.InvitedByID,
k2 => k2.ID,
(k1, k2) =>
new {
ConID = k1.InvitedByID,
ConFirstName = k2.FirstName,
ConLastName = k2.LastName
});
JoinedTables2.Dump();
答案 1 :(得分:1)
Kotval的答案是完全正确的,但你也会写第一部分,如
var Table1 = (from fis in FinancialInstitutionExaminers
select new { fis.InvitedByID } ).Distinct();
不同之处在于,当您使用k1 =>
时,k1将是一个包含名为InvitedByID的Guid的对象,因此您可以说k1 => k1.InvitedByID
,而在您的代码中,k1是Guid,您必须说{ {1}}。