Вызов функций из оператора linq - PullRequest
4 голосов
/ 03 марта 2011

Просто интересно, это самый эффективный способ сделать это? Есть ли способ, чтобы все linq внутри одного оператора вместо вызова метода, как подвыбор или что-то?

newEmployee = (from emp
               in db.employees
               select new 
               {
                   a.EmployeeID,
                   a.Username,
                   Status = emp.GetEmployeeCurrentStatus(a.Username)
               }).ToList();

Это GetEmployeeCurrentStatus, который возвращает статус сотрудника:

 public string GetEmployeeCurrentStatus(string username)
        {
            using (Entities db = new Entities())
            {
                var times = (from d in db.TimeTables
                             where d.DateTime == DateTime.Today &&
                             d.Employee.Username == username
                             select d)
                             .OrderByDescending(d => d.TimeID).FirstOrDefault();

                return (x.ClockOut == null ? "IN" : "OUT");                                
            }
        }

Ответы [ 5 ]

3 голосов
/ 03 марта 2011

как насчет:

newEmployee = (db.employees.Select(emp => new
                  {
                      emp.EmployeeID,
                      emp.Username,
                      Status = db.TimeTables
                        .Where(d => d.Employee.Username == emp.Username
                          && d.DateTime == DateTime.Today)
                          .Select(x => x.ClockOut == null ? "IN" : "OUT")
                          .FirstOrDefault()
                  })).ToList();

Ваша попытка может выглядеть более чистой и функционально приемлемой.Тем не менее, он запускает вторичный вызов БД.Это будет плохо для масштабируемости и производительности.В версии, которую я разместил, используется то же начальное соединение с БД, и соединение будет 1-1.Это приведет к более жестким и быстрым запросам, а также к снижению использования ресурсов.

2 голосов
/ 03 марта 2011

Вы не можете вызвать пользовательский метод внутри запроса (или часть запроса, которая будет выполнена с использованием базы данных).По сути, у вас есть две опции:

  • Вызов ToList перед выполнением select, который должен вызвать метод (таким образом, метод будет вызываться для данных в памяти)

  • Составьте запрос так, чтобы он мог выполняться на сервере SQL, если это возможно.Это можно сделать с помощью расширения AsExpandable в построителе предикатов .Для получения дополнительной информации о том, как это работает, см. Также мой блог .

1 голос
/ 03 марта 2011

хорошо для небольших данных (количество сотрудников), но так как каждый GetEmployeeCurrentStatus требует нового соединения sql, так что это не лучшая практика. Я лично получу всех сотрудников (одна поездка в базу данных), а затем получу статус всех сотрудников (одна поездка в базу данных), поэтому я обналичил их всех, теперь я присоединюсь к ним локально

Надеюсь, это помогло

0 голосов
/ 03 марта 2011

Предполагая, что вы используете LINQ to SQL или EF, я бы реорганизовал ваш запрос для использования Join.Таким образом, вы будете выполнять один эффективный SQL-запрос к базе данных вместо двух отдельных запросов.

0 голосов
/ 03 марта 2011

Независимо от эффективности, использование GetEmployeeCurrentStatus (...) в качестве метода делает код более понятным и более пригодным для повторного использования.

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