Система MS Dynamics CRM.InvalidCastException

У меня странная проблема, у меня есть множество сущностей, и у меня есть XrmSchema.cs, ​​сгенерированный CRMSvcUtil в моей системе crm, которая работала для меня довольно хорошо, особенно при использовании запросов и преобразовании их в объекты сущностей в коде. Этот метод преобразования отлично работал для всех объектов, кроме одного, я продолжаю получать сообщение об ошибке System.InvalidCastException: Unable to cast object of type 'Microsoft.Xrm.Sdk.Entity' для этого объекта. Вот следующий сегмент кода, который его генерирует, он генерирует исключение в методе toList():

 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 вызывается во время инициализации службы организации, поэтому он не выглядит виновником. И все остальные преобразования работают нормально в моем плагине, должно быть что-то не так с этим.


person erin c    schedule 06.04.2014    source источник
comment
Вы уже пытались получить одну запись etel_productcharacteristic по идентификатору? Я бы также попробовал запрос с поздней привязкой, чтобы узнать, находится ли проблема в сгенерированной схеме XrmSchema.   -  person Filburt    schedule 07.04.2014
comment
Запрос с поздней привязкой не работал, но помогло получение одной записи. Спасибо за предложение.   -  person erin c    schedule 07.04.2014


Ответы (1)


Вам нужно изменить эту строку:

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), так как это может не потребоваться — у меня просто нет передо мной кода для проверки.

person Nicknow    schedule 06.04.2014
comment
Да, вы сравниваете EntityReference с Guid, но обычно вы даже не должны компилироваться в этот момент. - person Mauro De Biasio; 14.04.2014
comment
В некоторых случаях разработчик несет ответственность за совместимость типов с поставщиком Dynamics CRM LINQ. У меня есть много запросов для компиляции, которые не могут быть выполнены. Я считаю, что большинство поставщиков LINQ основаны на функциях object == object, и приведение (способность) не проверяется до времени выполнения. Поскольку EntityReference нельзя сравнивать с Guid, а int нельзя сравнивать с OptionSetValue, вы получаете InvalidCastExeception. Вот почему я рекомендую всем разработчикам кодировать запросы (будь то LINQ, FetchXml или QueryExpression) в автономном классе, который упрощает модульное тестирование. - person Nicknow; 14.04.2014