Настройки запроса Linq - PullRequest
2 голосов
/ 31 июля 2010

Узнав немного о Linq. У меня есть следующий код:

(прошу прощения за жалкий размер набора данных)

class Program
{
    static void Main(string[] args)
    {
        var employees = new List<Employee>
                            {
                                new Employee
                                    {
                                        Name = "Bill Bailey",
                                        EmployeeCode = 12345,
                                        Department = "Comedy Lab",
                                        DateOfBirth = DateTime.Parse("13/01/1964"),
                                        CurrentEmployee = true
                                    },
                                new Employee
                                    {
                                        Name = "Boris Johnson",
                                        EmployeeCode = 56789,
                                        Department = "Cycling Dept.",
                                        DateOfBirth = DateTime.Parse("19/06/1964"),
                                        CurrentEmployee = true
                                    },
                                new Employee
                                    {
                                        Name = "Bruce Forsyth",
                                        EmployeeCode = 5,
                                        Department = "Comedy Lab",
                                        DateOfBirth = DateTime.Parse("22/03/1928"),
                                        CurrentEmployee = false
                                    },
                                new Employee
                                    {
                                        Name = "Gordon Brown",
                                        EmployeeCode = 666,
                                        Department = "Backbenches",
                                        DateOfBirth = DateTime.Parse("20/02/1951"),
                                        CurrentEmployee = false
                                    },
                                new Employee
                                    {
                                        Name = "Russell Howard",
                                        EmployeeCode = 46576,
                                        Department = "Comedy Lab",
                                        DateOfBirth = DateTime.Parse("23/03/1980"),
                                        CurrentEmployee = false
                                    }
                            };

        Func<Employee, bool> oapCalculator = (employee => employee.DateOfBirth.AddYears(65) < DateTime.Now);

        var oaps1 = employees.Where(oapCalculator);
        var oaps2 = (from employee in employees
                     where oapCalculator(employee)
                     select employee);

        oaps1.ToList().ForEach(employee => Console.WriteLine(employee.Name));
        oaps2.ToList().ForEach(employee => Console.WriteLine(employee.Name));

        Console.ReadLine();
    }

    class Employee
    {
        public string Name { get; set; }
        public int EmployeeCode { get; set; }
        public string Department { get; set; }
        public DateTime DateOfBirth { get; set; }
        public bool CurrentEmployee { get; set; }
    }
}

У меня есть несколько вопросов:

Насколько я могу судить, оба популярных запроса Linq делают одно и то же (может случиться черная магия).

  1. Будут ли они оба скомпилированы в один и тот же IL?
  2. Если нет, то почему и что было бы наиболее эффективным при значительном количестве данных?
  3. Каков наилучший способ контроля эффективности запросов Linq? Таймеры производительности или что-то встроенное?
  4. Является ли лямбда-выражение предпочтительным методом, поскольку он является наиболее кратким?
  5. Стоит ли в отделе лямбда-боязни луддитов окунуться и научить их или использовать синтаксис SQL-esque?

Спасибо

Ответы [ 3 ]

3 голосов
/ 31 июля 2010

Re

var oaps1 = employees.Where(oapCalculator);

против

var oaps2 = (from employee in employees
             where oapCalculator(employee)
             select employee);

Существует небольшая разница, в частности, вокруг where oapCalculator(employee). Второй запрос сопоставлен с:

var oaps2 = employees.Where(employee => oapCalculator(employee));

так что это дополнительный слой делегата, и также повлечет за собой (небольшие) издержки класса захвата из-за замыкания над переменной oapCalculator, и разыменование этого за итерацию. Но в остальном они одинаковы. В частности, Select тривиально удаляется (в соответствии со спецификацией).

В общем, используйте тот, который яснее в любом сценарии. В этом случае либо все в порядке, , но , вам будет проще использовать .Where и т. Д., Если вы регулярно работаете в сценариях с участием делегатов или Expression s.

2 голосов
/ 31 июля 2010

Я не имею в виду, что это глупость, но иногда лучше попробовать самим. Вдобавок к этому, вот некоторые инструменты и некоторые из моего собственного опыта.

1 и 2 : разберите и узнайте! :) http://www.red -gate.com / products / отражатель /

3 : Профилируйте свое приложение. Это ответ на любой определяющий вопрос вопрос, если вы не выполняете алгоритмическую работу (математические доказательства, big-o). Инструменты профилирования встроены в VS.

4 : Что вы предпочитаете? Как насчет ваших коллег? Это звучит как статистический вопрос, который потребует обследования

5 : аналогично 4, попробуйте и узнайте! Как вы, возможно, испытали, проповедуя новые методы своим коллегам, вы научитесь тому же, что и они.

Я обнаружил, что у меня примерно 50% успеха при обучении генеральному делегату / использованию лямбды. Я позаботился о том, чтобы придумать практические примеры из моего производственного тестового кода, и показал, что эквивалентный императивный код имеет много дубликатов.

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

http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/

0 голосов
/ 31 июля 2010

Оба запроса LINQ эквивалентны.Второй использует синтаксический сахар, который компилятор переводит в выражение, подобное вашему первому запросу, перед компиляциейЧто касается того, что является предпочтительным, используйте то, что кажется более читабельным для вас и вашей команды.

...