Только начал изучать C# и сталкиваюсь с ошибками
Есть класс который вычисляет возраст из даты в виде 1912-07-25 16:28:07, которая хранится в базе данных
{
public partial class Runner
{ // метод вычисления возраста
public int getYear
{
get
{
var a = DateOfBirth.ToString();
var b = a.Split('.');
var c = b[2].Split(' ');
return DateTime.Now.AddYears(-Convert.ToInt32(c[0])).Year;
}
}
}
}
и так же есть датагрид который сортируется по комбобоксам и по возрасту(getYear) который мы сравниваем с категорией возраста(в данном случае до 18 лет)
private void Update()
{ // сортировка по комбобоксам
{
grid.ItemsSource = null;
grid.ItemsSource = AppData.Ent.RegistrationEvents.
Where(x => x.EventId == Marathon.SelectedValue.ToString() &&
x.Event.EventType.EventTypeId == Distance.SelectedValue.ToString() &&
x.Registration.Runner.Gender == (string)CBGender.SelectedValue &&
x.Registration.Runner.getYear < 18).ToList();
}
}
так вот при сортировке выскакивает ошибка,помогите как ее исправить?
System.NotSupportedException: "The specified type member 'getYear' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."
Предположу, что вы используете EntityFramework. Тогда exception вылетает потому, что EntityFramework пытается сконвертировать ваше условие в SQL запрос, но не может, ибо вы сами добавили поле getYear.
Решить проблему можно так:
grid.ItemsSource = AppData.Ent.RegistrationEvents
.Where(x => x.EventId == Marathon.SelectedValue.ToString() &&
x.Event.EventType.EventTypeId == Distance.SelectedValue.ToString() &&
x.Registration.Runner.Gender == (string)CBGender.SelectedValue)
.ToList()
.Where(x => x.Registration.Runner.getYear < 18).ToList();
Дополнительный совет:
Поле getYear можно переписать более красивым и универсальным способом:
//Такая запись аналогична данной вами
public int GetYear => (int)Math.Floor((DateTime.Now - DateOfBirth).TotalDays / 365); //365 дней в году
//Если всё-таки хочется оставить ваш стиль
public int getYear
{
get
{
TimeSpan timeSinceBirth = DateTime.Now - DateOfBirth;
return (int)Math.Floor(timeSinceBirth.TotalDays / 365);
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости