как вызвать метод в Linq?

Пытаюсь вызвать локальный метод внутри Linq, в методе нужно преобразовать год рождение в возраст пример (01.01.2000 => 21)

 public AdminPanel()
        {

            InitializeComponent();
            db = new ContextDB();
            var context = (from us in db.Users
                           join ro in db.Roles on us.RoleId equals ro.Id
                           join of in db.Offices on us.OfficeId equals of.Id
                           select new
                           {
                               firstname = us.Firstname,
                               lastname = us.Lastname,
                               age = Calculate(us.Birthdate),
                               role = ro.Title,
                               email = us.Email,
                               id = us.Id,
                               office = of.Title,
                               active = us.Active
                           }).ToList();
            DataContext = context;
        }

        private string Calculate(string birthdate)
        {
            return "abc";
        }

Получаю исключение

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Uranus

Выражение, которое вы передаёте в метод Select, используется для построения SELECT части SQL запроса. А метод Calculate нельзя вызвать при выполнении запроса на SQL сервере.

Есть три варианта решения:

  1. Вставить тело метода прямо в Select. В приведенном вами примере это будет выглядеть так (но я понимаю что на самом деле тело метода сложнее и возможно не поместится в Select):
select new {
  ...
  age = "abc"
}
  1. Удалить age из Select, а после ToList продублировать тот же самый Select но уже с age.
  2. Объявить класс, в котором будут все поля упомянутые в Select. При этом age будет только для чтения, и для вычисления значения age будет использовать метод Calculate. Тогда вы сможете использовать этот класс в методе Select:
select new MyClass() {
  firstname = us.Firstname,
  ...
}
→ Ссылка