加入LINQ错误:&#34; CS1061&#39; Guid&#39;不包含<column name =“”>

时间:2018-05-01 21:38:07

标签: linq linqpad

我正在学习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 =&gt;行k1.InvitedByID 即可。当我指定列&#34; InvitedByID 时,&#34;我收到了错误&#34; CS1061&#39; Guid&#39;不包含&#39; InvitedByID&#39;的定义。

InvitedByID 确实存在于我的数据源中,它与我加入的列的类型相同(ID,由我的联接中的k2 =&gt; k2.ID指定)。两列都是GUID。

这是什么引起了我的兴趣。如果我修改如下代码,从k1 =&gt;中删除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();

2 个答案:

答案 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}}。