多个Linq(扩展方法)与匿名类型连接

时间:2015-03-23 22:00:02

标签: c# linq join anonymous-types inferred-type

在C#中,我正在尝试进行多个扩展方法连接,其中第二个连接是由第一个连接产生的匿名类型的可枚举:

List<Contact> filteredContactList = GetFullContacts()
    .Join(GetContactCompanyRoles()
        , ct => ct.IdContact
        , ctCmpRole => ctCmpRole.IdContact
        , (ct, ctCmpRole) => new { Contact = ct, ContactType = ctCmpRole.ContactType })
    .Join(GetContactRoles()
        , ctf => new { ctf.Contact.IdContact, ctf.ContactType }
        , ctRole => new { ctRole.ContactId, ctRole.ContactType }
        , (ctf, ctRole) => new { Contact = ctf.Contact, PrimaryInd = ctRole.IsPrimary})
    .Select(rec => rec.Contact)
    .ToList();

ct和ctf.Contact属于Type Contact。

但是,我在尝试编译时遇到以下错误:

  

无法从用法中推断出方法'System.Linq.Enumerable.Join ...'的类型参数。尝试明确指定类型参数。

有没有办法绕过这个错误,而不必为第一次加入的匿名类型创建一个实际的类?还有其他我不考虑的选择吗?

2 个答案:

答案 0 :(得分:2)

我注意到一个明显的印刷错误:

    , ctRole => new { ctRole.IdContact, ctRole.ConatactType }

也许你的意思是:

    , ctRole => new { ctRole.IdContact, ctRole.ContactType }

即。使用ContactType而不是ConatactType。


解决此问题后,通过评论/聊天我们确定编译器错误仍在发生,因为用于设置多键连接的一些匿名类没有相同的成员名称。换句话说,而不是:

   , ctf => new { ctf.Contact.IdContact, ctf.ContactType }
    , ctRole => new { ctRole.ContactId, ctRole.ContactType }

需要在两个任意类之间规范化成员名称:

   , ctf => new { ContactID = ctf.Contact.IdContact, ctf.ContactType }
    , ctRole => new { ContactID = ctRole.ContactId, ctRole.ContactType }

答案 1 :(得分:0)

在Vincent Ugenti的帮助下,由于属性名称不匹配,确定编译器无法评估第二个连接的join子句参数中的两个匿名类型。添加时

ContactID = 

对两个匿名初始化程序,代码都能够编译。

.Join(GetContactRoles()
    , ctf => new { ContactID = ctf.Contact.IdContact, ctf.ContactType }
    , ctRole => new { ContactID = ctRole.ContactId, ctRole.ContactType }
    , (ctf, ctRole) => new { Contact = ctf.Contact, PrimaryInd = ctRole.IsPrimary})