LINQ to Entities не распознает метод [Тип] GetValue [Тип] - PullRequest
3 голосов
/ 14 марта 2012

enter image description here У меня есть простой класс, подобный этому:

Public Class CalculationParameter{
    public Long TariffId{get;set;}
}

В рабочем процессе у меня есть Назначить , например:

(From tariffDetail In db.Context.TariffDetails
Where tariffDetial.TariffId = calculationParameter.TariffId).FirstOrDefault()

Dto передается в Activity как Входной аргумент .

Это вызывает следующую ошибку, и мне интересно, как назначить Id.Любая идея?

LINQ to Entities не распознает метод метода Int64 GetValue [Int64] (System.Activities.LocationReference) ', и этот метод нельзя преобразовать в выражение хранилища.

Как я могу назначить вычислениеParameter.TariffId для тарифаDetial.TariffId?!

ОБНОВЛЕНИЕ: Прикрепленный снимок экрана показывает, как я пытаюсь назначить calculationParameter.TariffId дляtariffDetail.TariffId (car.Id = Dto.Id) и результат запроса должен быть присвоен CurrentTrafficDetail объекту.

1 Ответ

3 голосов
/ 14 марта 2012

Вот ваша проблема.Я не знаю, есть ли решение для этого.

Как вы сказали в (сейчас удаленном, к сожалению, требующем, чтобы я ответил) комментарии, вы получаете исключение

LINQ to Entities не распознает метод Int64 GetValue [Int64] (System.Activities.LocationReference), и этот метод нельзя преобразовать в выражение хранилища.

в вашем запросе Linq, analysisParameter - это переменная, определенная в рабочем процессе.Эта переменная на самом деле является экземпляром, который расширяет тип System.Activities.LocationReference и NOT CalculationParameter .

Обычно, когда рабочий процесс выполняется, LocationReference содержит всю информацию, необходимую для поиска значения, которое ему присвоено.Это значение не извлекается до последнего возможного момента.Во время выполнения процесс поиска (получение исполняемого контекста, получение значения, преобразование его в ожидаемый тип) управляется рабочим процессом.

Однако, когда вы вводите Linq в смесь, у нас возникает проблемавы испытываетеКак вы можете знать, а может и не знать, ваше выражение компилируется в ту же версию метода расширения.

(From tariffDetail In db.Context.TariffDetails  
Where tariffDetial.TariffId = calculationParameter.TariffId)
.FirstOrDefault()

компилируется в

db.Context.TariffDetails
          .Where(x => x.TariffId = calculationParameter.TariffId)
          .FirstOrDefault();

Когда это выполняется, L2E на самом деле не выполняет этот код .Он получает , интерпретируется и преобразуется в SQL-запрос, который выполняется к базе данных.

Поскольку интерпретатор не всезнающий, существует четко определенный набор ограничений на методы, которые вы можете использовать в запросе L2S.

К сожалению для вас, получениетекущее значение LocationReference не является одним из них .

TL: DR Вы не можете сделать это.

Что касается обходных путей, единственное, что я думаю, выможно создать серию методов расширения для вашего типа контекста данных или добавить методы в свой класс CalculationParameter, который вы можете вызывать из редактора выражений.Вы можете создавать запросы Linq to Entities в этих методах, так как все типы уже будут разыменованы средой выполнения рабочего процесса, что означает, что вам не придется беспокоиться о блокировке интерпретатором L2E LocationReferences.

* Редактировать: Обходной путь можно найти здесь (спасибо Slauma , который упомянул это в комментарии к вопросу)

...