2012-04-26 2 views
2

У меня есть следующие LINQ к выражению лиц:выражения Linq не поддерживается

var allItemsOver64 = 
    _inventoryContext.Items.Where(
    i => DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) >= 65); 

Проблема заключается в том, что, когда я использую allItemsOver64 он говорит, что это выражение не поддерживается. У меня такое чувство, что эта ошибка происходит из-за вызова метода CalculateAgeInYears. Почему это происходит и как я могу это исправить?

Спасибо,

Сэчин

Edit:

Даже после того, как изменить код, чтобы использовать IEnumerables я все еще получаю ту же ошибку. Вот мой код:

DateTime now = DateTime.UtcNow; 
      var allItemsOver64 = 
       _inventoryContext.Items.Where(
        i => DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) >= 65).AsEnumerable(); 
      IEnumerable<Item> items65To69 = allItemsOver64.Where(
       i => 
       DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) >= 65 && 
       DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) <= 69).AsEnumerable(); 
+0

Так он работает с '<= 65'? – Sorax

+0

Мне не нужны никакие предметы в возрасте менее 65, чтобы даже не прийти в уравнение. –

ответ

2

Если я правильно вывести из ваших функций имя, я думаю, что это может быть то, что вы ищете:

using System.Data.Objects.SqlClient; 

var allItemsOver64 = _inventoryContext 
        .Items 
        .Where(i => (SqlFunctions 
            .DateDiff("dd", i.PrimaryInsured.DoB, now)/365.0) 
            >= 65.0); 
+0

У меня есть это уже - мне нужно, чтобы он работал сейчас. –

+0

Вы на правильном пути, но вы уйдете на год, пока дата рождения человека не пройдет ** этот ** год. – Yuck

+0

@Sachin Извините, вы не видите, что вы используете 'SqlFuntions' в своем коде. – Sorax

2

Поскольку Linq не может интерпретировать ваш вспомогательный метод для команды SQL. Вы должны реализовать такую ​​логику на стороне db или выбрать все значения и только затем выполнить проверку на стороне клиента. Ни один из них не подходит для меня, поэтому я всегда стараюсь упростить БД, чтобы сделать как можно более простые запросы.

+0

Как реализовать эту логику на стороне db? –

+0

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

+0

Привет, Джонни. Я пытаюсь подойти к клиентской стороне, сделав результат IEnumerable (см. Выше), но я все равно получаю точно такую ​​же ошибку. Почему это? –

5

Вы не можете вызывать методы C# в запросах EF, потому что EF не знает, как превратить этот метод в SQL.

Сначала позвоните .AsEnumerable(), чтобы заставить Where() работать локально.

+1

Это сработает ... но что, если в комплект входят миллионы записей? Для этого сначала потребуются все записи для клиента. Затем функция вызывается для каждого элемента в памяти. Это может действительно убить производительность. – Yuck

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