在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为接触型。
然而,当我试图编译时,我得到了以下错误:
方法System.Linq.Enumerable.Join.的类型参数不能从使用中推断。尝试显式指定类型参数。
是否有一种方法可以避免此错误,而不必为第一个联接中的匿名类型创建一个实际的类?还有其他我没有考虑的选择吗?
发布于 2015-03-23 22:10:02
我在这里注意到一个明显的排印错误:
, 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 }发布于 2015-03-23 23:21:01
在Vincent的帮助下,由于属性名称不匹配,编译器无法计算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})https://stackoverflow.com/questions/29221271
复制相似问题