【发布时间】:2018-05-01 21:38:07
【问题描述】:
我正在学习 LINQ,使用 LINQPAD 进行测试,并且遇到了我无法解释的 JOINing 错误。我搜索了这个论坛,我能找到的最接近接受的答案是我加入的键不是相同的数据类型,但我可以绝对保证它们是(它们都是 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 => k1.InvitedBy 中删除 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();
【问题讨论】: