c #, как вызвать метод вычисления возраста и вызов метода в Linq, окно формы - PullRequest
0 голосов
/ 19 апреля 2019

Я получаю это сообщение об ошибке при загрузке всех сотрудников при загрузке сотрудников в форме dataGridView.

"LINQ to Entities не распознает метод метода int32 CalculateAge (Int32) ', и этот метод нельзя перевести в выражение хранилища"

Так я их заполняю в dataGridView

private void LoaddEmployees() {
   try
    {
        db = new EmployeeEntities();

        var employees = (from u in db.Users 
                         select new
                         {
                             EmployeeId = u.EmployeeId,
                             UserName = u.UserName,
                             FirstName = u.FirstName,
                             LastName = u.LastName,
                             Birthday = u.Birthday,
                             Age = CalculateAge(u.EmployeeId) // Calling CalculateAge method
                         }).ToList();
        dgvEmployeesList.DataSource = employees;                  
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
} 

А вот мой метод CalculateAge, с которым у меня проблема. Сам расчет (математика) работает, но при загрузке dataGridview выдается ошибка.

 private int CalculateAge(int employeeId) {

    int age;
    var employeeAge = db.Users.Where(x => x.EmployeeId == employeeId).FirstOrDefault();

            DateTime empBirthday = Convert.ToDateTime(empAge.Birthday);
            DateTime today = DateTime.Today;
            age = today.Year - empBirthday.Year;
            if (empBirthday > today.AddYears(-age)) 
                age--;
                return age; 
}

При загрузке страницы появляется сообщение об ошибке:

Пожалуйста, мне нужна ваша помощь, чтобы решить эту проблему. Я действительно не понимаю, что не так с моим кодом.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Вы можете преобразовать db.Users в список, а затем выполнить оценку вашего возраста расчета. Код будет выглядеть примерно так:

private void LoaddEmployees()
    {
        try
        {
            db = new EmployeeEntities();

            var employees = (from u in db.Users.ToList()
                             select new
                             {
                                 EmployeeId = u.EmployeeId,
                                 UserName = u.UserName,
                                 FirstName = u.FirstName,
                                 LastName = u.LastName,
                                 Birthday = u.Birthday,
                                 Age = CalculateAge(u.Birthday) // note that we are sending in the Birthday
                             }).ToList();
            dgvEmployeesList.DataSource = employees;


        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

А затем обновите метод CalculateAge как

private int CalculateAge(string birthday)
    {
        if (string.IsNullOrWhiteSpace(birthday)) return 0;

        DateTime empBirthday = Convert.ToDateTime(birthday);
        DateTime today = DateTime.Today;
        age = today.Year - empBirthday.Year;
        if (empBirthday > today.AddYears(-age))
            age--;
        return age;
    }
0 голосов
/ 19 апреля 2019
 var employees = (from u in db.Users 
                                 select new
                                 {
                                     EmployeeId = u.EmployeeId,
                                     UserName = u.UserName,
                                     FirstName = u.FirstName,
                                     LastName = u.LastName,
                                     Birthday = u.Birthday,
                                     Age = CalculateAge(u.EmployeeId) // Calling CalculateAge method
                                 })

эта часть вашего кода преобразуется в SQL-запрос Entity Framework, и, к сожалению, ваш метод C # CalculateAge(u.EmployeeId) не может быть преобразован в SQL. Вы не можете использовать такие пользовательские методы с IQueriable. сначала получить данные, затем применить метод или выполнить те же вычисления на стороне SQL (например, хранимая процедура).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...