LINQ для объектов против каждого - разница во времени выполнения - PullRequest
1 голос
/ 22 октября 2009

У меня это для каждого цикла

foreach (Account acct in acctTest)
            {
                if (acct.AccountId == acctId)
                {
                    foreach (Customer cust in acct.CustomerColl)
                    {
                        if (cust.CustomerId == custId)
                        {
                            customerName = cust.CustomerName;
                            break;
                        }
                    }
                }
            }

Запрос Linq, который делает подобные вещи (думаю, это можно улучшить)

customerName = (from acct in acctTest
                           where acct.AccountId == acctId
                           from cust in acct.CustomerColl
                           where cust.CustomerId == custId
                            select cust.CustomerName).ToString() ;

Я выполняю вышеупомянутые два в цикле 1000 раз по 5 раз, получаю время выполнения, как показано ниже.

Истекшее время для каждого ::: 7377
Прошедшее время для Linq2 ::: 15653
Истекшее время для каждого ::: 1576
Прошедшее время для Linq2 ::: 1718
Прошедшее время для каждого ::: 1569
Прошедшее время для Linq2 ::: 1726
Прошедшее время для каждого ::: 1569
Прошедшее время для Linq2 ::: 5583
Истекшее время для каждого ::: 1570
Прошедшее время для Linq2 ::: 1506

почему есть разница и несогласованность в сроках исполнения? Кроме того, можно ли переписать запрос LINQ для повышения производительности?

Ответы [ 4 ]

2 голосов
/ 22 октября 2009
(from acct in acctTest
where acct.AccountId == acctID
select acct.CustomerColl)
  .Where(c => c.CustomerId == custId)
  .Select(cn => cn.CustomerName)
  .FirstOrDefault()
1 голос
/ 22 октября 2009

Очевидная вещь, глядя на приведенный выше код: - В случае foreach вы останавливаете выполнение внутреннего цикла, когда a найдено совпадение для customerID.

Принимая во внимание, что это не относится к LINQ.

Вывод foreach и запрос LINQ одинаков?
Как насчет использования JOIN и использования FirstOrDefault, как кто-то предложил здесь?

1 голос
/ 22 октября 2009

Четвертое выполнение выглядит так, будто оно попало в сборку мусора на стороне Linq.

Кроме этого, LINQ не знает, что вы пытаетесь получить только один экземпляр имени клиента. Он не знает отношения, что CustomId или AccountIds являются уникальными, что и предполагает ваш код. Короче говоря, код не аналогичен:)

Кроме того, в первом примере вы можете проверить во внешнем цикле, если custerName! = NULL, чтобы вы могли остановиться коротко;)

0 голосов
/ 22 октября 2009

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

...