Проблема с фильтрацией данных Entity Framework по вычисляемым полям

1

Здесь упрощенный EF Scenerio моей проблемы:

public partial class MyClass
{
    public int ID { get; set; }
    public byte Month { get; set; }
    public int Year { get; set; }

    public DateTime CalculatedDate
    {
        get
        {
            return new DateTime(this.Year, this.Month, 1);
        }
    }
}

Я использую шаблон репозитория для доступа к этим объектам, который также реализует метод Where (предикат), который возвращает IEnumrable, подобно LINQ. он используется следующим образом:

var myClasses = myClassRepo.Where(mc=> mc.ID > 10);

это хорошо работает и возвращает ожидаемые объекты со всеми полями, включая CalculatedDate. ОДНАКО, когда я пытаюсь использовать вычисленное поле как часть предиката следующим образом:

var myClasses = myClassRepo.Where(mc=> mc.CalculatedDate == DateTime.Now);

Я получаю сообщение об ошибке:

В экземпляре объекта не задана ссылка на объект.

Я знаю, что могу "обойти" это, получив первый набор результатов, а затем отфильтровывая его по вычисленному полю. но я пытаюсь понять, почему это происходит и что можно сделать, чтобы исправить это.

Теги:
linq
entity-framework
entity-framework-6
repository-pattern

2 ответа

0

Я думаю, это потому, что EF не поддерживает запросы на пользовательские свойства, поскольку они не могут быть переведены в столбец DB

0

Entity Framework пытается преобразовать LINQ в SQL, поэтому у него возникли проблемы с попыткой конвертировать ваш метод MyClass.CalculatedDate в нечто узнаваемое в SQL. Вы можете обойти это, добавив в LINQ запрос.AsEnumerable() в вашем LINQ, например:

var myClasses = myClassRepo.AsEnumerable().Where(mc => mc.CalculatedDate == DateTime.Now);
  • 0
    Глядя на профилировщик SQL, CalculatedDate, похоже, не является частью запроса. плюс, добавление AsEnumerable не помогает в этом случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню