Здесь упрощенный 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);
Я получаю сообщение об ошибке:
В экземпляре объекта не задана ссылка на объект.
Я знаю, что могу "обойти" это, получив первый набор результатов, а затем отфильтровывая его по вычисленному полю. но я пытаюсь понять, почему это происходит и что можно сделать, чтобы исправить это.
Я думаю, это потому, что EF не поддерживает запросы на пользовательские свойства, поскольку они не могут быть переведены в столбец DB
Entity Framework пытается преобразовать LINQ в SQL, поэтому у него возникли проблемы с попыткой конвертировать ваш метод MyClass.CalculatedDate в нечто узнаваемое в SQL. Вы можете обойти это, добавив в LINQ запрос.AsEnumerable() в вашем LINQ, например:
var myClasses = myClassRepo.AsEnumerable().Where(mc => mc.CalculatedDate == DateTime.Now);