2016-04-28 1 views
0

Я создаю сложный запрос Linq, и я столкнулся с проблемой: «Указанный член типа« JobRatio »не поддерживается в LINQ to Entities».Стратегии для переназначения вычисляемых типов в LINQ для объектов

В моей модели, Джобс является IEnumerable:

Работа имеет следующую вычисляемое свойство:

public decimal JobRatio 
{ 
    get 
    { 
     return TotalValueApprovedQuotes == 0 ? 0 : ((TotalValueApprovedQuotes - TotalWorkOrders)/TotalValueApprovedQuotes); 
    } 
} 

Когда я пытаюсь установить, где это пункты из моего запроса на основе требований пользователя:

if (model.ShowJobRatio) 
{ 
    jobs = jobs.Where(x => x.JobRatio < 0.3m); 
} 

Я получаю ошибку, что «указанный тип член„JobRatio“не поддерживается в LINQ к Entities»

Хотя я понимаю, что могу изменить свой IEnumerable в List, чтобы решить проблему, у меня на самом деле есть несколько из этих вычисленных свойств, которые нужно пройти, и хотелось бы еще не запускать запрос. (поскольку я все еще строю предложения Where)

Одним из вариантов было бы превратить этот тип в базовое десятичное значение, которое предварительно рассчитано, каковы некоторые стратегии для решения этой проблемы? И если я должен был рассчитать это, я делаю это на модели? Или в контроллере, когда меняются TotalValueApprovedQuotes, TotalWorkOrders или TotalValueApprovedQuotes?

+1

Вам нужно будет рассчитать его в запросе, вы не можете использовать свойство. Также вы должны добавить атрибут «NotMapped» над этим свойством. –

ответ

1

Если это код, вы можете добавить установщик к вычисленному свойству, чтобы EF распознал его как постоянное поле.

public decimal JobRatio 
{ 
    get { return ...; } 
    set { } 
} 

Делая это, EF будет хранить рассчитанное значение при редактировании и сохранить объект, но он не сможет заполнить значение на нагрузке, так что вы всегда иметь до значения даты в памяти.

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

Обратите внимание, что в то время как это не так, тройные операторы() принимаются в LINQ to Entities, поэтому вы можете использовать свои вычисления вместо x.JobRatio.

+0

Это прекрасно, я не знал, что вы можете это сделать. Как я могу перебирать все объекты для вычисления этого поля после обновления базы данных? (jobratio будет 0 до тех пор, пока я не отредактирую и не сохраню объект) –

+0

@ RobbieMills Предполагаю, что вы имеете в виду исторические/ранее существовавшие данные. Не переусердствуйте с этим вопросом, просто напишите сценарий обновления сразу после запуска и добавьте его в процесс миграции базы данных. Что-то в строках (при условии MS SQL) 'UPDATE Jobs SET JobRatio = (TotalValueApprovedQuotes - TotalWorkOrders)/TotalValueApprovedQuotes WHERE TotalValueApprovedQuotes <> 0;'. –

+0

P.S. Благодарим за принятие, не забудьте запереть. :) –

Смежные вопросы