加入时出现 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