2014-04-06 171 views
1

我有一个奇怪的问题,我有大量的实体,我有CRMSvcUtil生成的XrmSchema.cs在我的crm系统中工作对我来说很不错,特别是在使用查询并将它们转换为实体代码中的对象。此转换方法适用于除一个以外的所有实体,我一直收到System.InvalidCastException:无法为此实体投射“Microsoft.Xrm.Sdk.Entity”类型的对象错误。下面是产生它下面的代码段,它会抛出异常的toList()方法:MS Dynamics CRM System.InvalidCastException

public List<etel_productcharacteristic> RetrieveCharacteristic(Guid characteristicId) 
     { 
      using (XrmDataContext context = new XrmDataContext(CRMConnection.OrganizationService)) 
      { 
       var query = from characteristic in context.etel_productcharacteristicSet 
          where characteristic.etel_productcharacteristicId == characteristicId && characteristic.statecode.Value == etel_productcharacteristicState.Active 
          select characteristic; 
       return query.ToList(); 


      } 
     } 

任何人都可以点我什么可能是错误与此代码。顺便说一下,我在互联网上阅读的所有解决方案都建议使用enableproxy方法。在我的情况下,Enableproxy方法在组织服务被初始化时被调用,所以它看起来不像罪魁祸首。所有其他转换工作正常我的插件 必须有这个错误。

+1

您是否已尝试通过Id检索单个“etel_productcharacteristic”记录?我也会尝试一个后期绑定的查询来查看问题是否位于生成的XrmSchema中。 – Filburt

+0

延迟查询不起作用,但检索单个记录有所帮助。感谢您的建议。 –

回答

2

你需要改变这一行:

where characteristic.etel_productcharacteristicId == characteristicId && characteristic.statecode.Value == etel_productcharacteristicState.Active 

阅读

where characteristic.etel_productcharacteristicId.Id == characteristicId && characteristic.statecode.Value == (int)etel_productcharacteristicState.Active 

老实说,你需要仔细检查我的(int)投,因为它可能并不需要 - 我只是没有在我面前的代码来验证。

+0

是的,你在比较一个EntityReference到一个Guid,但通常你甚至不应该在这时编译 – Draiden

+0

在某些情况下,开发者有责任与Dynamics CRM LINQ提供者进行类型兼容。我收到很多无法执行的编译查询。我相信大多数LINQ提供者都是基于'object == object'函数的,并且直到运行时才会检查cast(ability)。由于'EntityReference'不能与'Guid'进行比较,'int'不能与'OptionSetValue'进行比较,所以你会得到一个'InvalidCastExeception'。这就是为什么我建议所有开发人员的代码查询(无论是LINQ,FetchXml还是QueryExpression)在简化单元测试的独立类中。 – Nicknow