В чем разница между этими двумя операторами LINQ? - PullRequest
1 голос
/ 21 апреля 2010

У меня был 1-й оператор в моем коде, и я обнаружил, что он не дает точного подсчета, он возвращал 1, когда правильный ответ - 18. Чтобы попытаться отладить проблему, я разбил ее, создав 2-й оператор здесь, и счетчик вернулся18. Я просто не вижу, в чем разница между этими двумя.Кажется, что 1-й просто более компактен.

В настоящее время я запускаю эти два оператора вплотную и уверен, что база данных не меняется между ними.

int count = (from s in surveysThisQuarter
             where s.FacilityID == facility.LocationID
             select s.Deficiencies).Count();

против

 var tempSurveys = from s in surveysThisQuarter
                   where s.FacilityID == facility.LocationID
                   select s;
 int count = 0;
 foreach (Survey s in tempSurveys)
     count += s.Deficiencies.Count();

Ответы [ 5 ]

7 голосов
/ 21 апреля 2010

В первом запросе вы выбираете группу «наборов недостатков» и подсчитываете сколько целых чисел у вас . Вместо этого вы хотите суммировать их по звукам:

int count = (from s in surveysThisQuarter
             where s.FacilityID == facility.LocationID
             select s.Deficiencies.Count()).Sum();

или (может генерировать лучший SQL, кто знает)

int count = (from s in surveysThisQuarter
             where s.FacilityID == facility.LocationID
             from x in s.Deficiencies
             select x).Count();
4 голосов
/ 21 апреля 2010

Это связано с тем, что второй фрагмент суммирует количество недостатков, а первый подсчитывает недостатки.
Это так же, как ваш второй фрагмент

int count = (from s in surveysThisQuarter 
             where s.FacilityID == facility.LocationID 
             select s.Deficiencies.Count()).Sum(); 
1 голос
/ 21 апреля 2010

Моя лучшая догадка:

Подсчет! = Сумма

Вы хотите, чтобы накопленное значение .Count?

1 голос
/ 21 апреля 2010

Во-первых, возвращается Count на IEnumerable<Deficiencies> (или любой другой тип дефектов). Результат будет таким же, как surveysThisQuarter.Count(). Это потому, что в результате получается коллекция коллекций.

Второй подсчитывает все недостатки - это, вероятно, то, что вы хотите.

Для первой работы вам нужно будет SelectMany вместо Select, чтобы сгладить вашу коллекцию.

1 голос
/ 21 апреля 2010

Первая форма считает количество подходящих строк. Вместо этого вы должны использовать метод расширения Sum.

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