加入时出现 LINQ 错误:“CS1061 'Guid' 不包含 <column name> 的定义
LINQ error on join: "CS1061 'Guid' doesn't contain a definition for <column name>
我正在学习 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) 如果没有它,代码怎么可能 work (我可以看到 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();
您的投影(使用 select
)不正确。似乎您正在尝试访问IEnumerable<T> FinancialInstitutionExaminers
中任何类型T
的对象的属性InvitedByID
(用您使用的任何类型填写此T
因为我看不到你的那部分代码)。即属性returns一个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();
Kotval 的回答完全正确,但您也可以像这样写第一部分
var Table1 = (from fis in FinancialInstitutionExaminers
select new { fis.InvitedByID } ).Distinct();
不同之处在于,当您使用 k1 =>
时,k1 将是一个包含名为 InvitedByID 的 Guid 的对象,因此您可以说 k1 => k1.InvitedByID
,而在您的代码中,k1 是 Guid,您必须说 k1 => k1
。
我正在学习 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) 如果没有它,代码怎么可能 work (我可以看到 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();
您的投影(使用 select
)不正确。似乎您正在尝试访问IEnumerable<T> FinancialInstitutionExaminers
中任何类型T
的对象的属性InvitedByID
(用您使用的任何类型填写此T
因为我看不到你的那部分代码)。即属性returns一个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();
Kotval 的回答完全正确,但您也可以像这样写第一部分
var Table1 = (from fis in FinancialInstitutionExaminers
select new { fis.InvitedByID } ).Distinct();
不同之处在于,当您使用 k1 =>
时,k1 将是一个包含名为 InvitedByID 的 Guid 的对象,因此您可以说 k1 => k1.InvitedByID
,而在您的代码中,k1 是 Guid,您必须说 k1 => k1
。