ошибка System.NotSupportedException С#

154
28 марта 2019, 06:00

Только начал изучать 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."

Answer 1

Предположу, что вы используете 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);
        }
    }
READ ALSO
Xamarin, графическая няшность

Xamarin, графическая няшность

ПриветсвуюЯ изучаю Xamarin и мне интересно как сделать так, чтобы на кнопке были блики, полутона и тд? Стандартных средств не хватает или Я в них...

168
Неясность с несколькими типами generic

Неясность с несколькими типами generic

Представлен базовый интерфейс, а так же класс:

162
Ошибка подлключения к SQL DB через System.Data.SqlClient

Ошибка подлключения к SQL DB через System.Data.SqlClient

Приподключении к БД возникла следующия ошибка

165
Запуск приложения C# на Linux Ubuntu [закрыт]

Запуск приложения C# на Linux Ubuntu [закрыт]

Пишу консольное приложение на C#, очень нужно перенести его на сервер под Linux Ubuntu, но не знаю какСлышал о проекте под названием Mono, но не понимаю...

192