2013-11-19 3 views
2

В веб-приложении, с которым я работаю, я нашел медленный фрагмент кода, который я хотел немного ускорить. Оригинальный код ниже:Почему эти два запроса linq возвращают разные результаты?

foreach (Guid g in SecondaryCustomersIds) 
{ 
    var Customer = (from d in Db.CustomerRelationships 

        join c in Db.Customers on 
        d.PrimaryCustomerId equals c.CustomerId 

        where c.IsPrimary == true && d.SecondaryCustomerId == g 
        select c).Distinct().SingleOrDefault(); 
    //Add this customer to a List<> 
} 

Я думал, что это может быть быстрее, чтобы загрузить все это в одном запросе, поэтому я попытался переписать его как ниже запроса:

var Customers = (from d in Db.CustomerRelationships 

       join c in Db.Customers on 
       d.PrimaryCustomerId equals c.CustomerId 

       where c.IsPrimary == true && SecondaryCustomersIds.Contains(d.SecondaryCustomerId) 
       select c).Distinct(); 

которая действительно быстрее, но теперь новый запрос возвращает меньше записей, чем первый. Мне кажется, что эти два куска кода делают то же самое и должны возвращать одинаковое количество записей. Кто-нибудь может понять, почему они этого не сделали? Что мне здесь не хватает?

+0

Возможно, у вас есть дубликаты в 1-м? Вы пробовали сделать «.Distinct» в последнем списке, к которому вы добавляете всех клиентов? – SJuan76

+0

Нет, извините, я должен был упомянуть об этом. Получение отдельного финального списка возвращает один и тот же счетчик, поэтому дубликатов не возвращается. –

+0

Как определяется «SecondaryCustomersIds»? – SJuan76

ответ

1

Возможно, первый запрос добавит нулевой объект в список (SingleOrDefault вернет значение по умолчанию для этого типа, или null в этом случае, если он не может найти соответствующий объект). Таким образом, для каждого Клиента без соответствия отношения вы можете добавить нулевой объект к этому List<>,, который увеличит счет.

+0

Hrrm, хороший момент. Позвольте мне сделать рытье. –

0

В вашем первом сценарии у ваших последних List<Customers> есть дубликаты?

Вы звоните Distinct, но также и зацикливаете, что означает, что вы не делаете Distinct на всей вашей коллекции.

Ваш второй пример - вызов Distinct по всей коллекции.

+0

это то, что @ SJaun76 спросил в комментарии ... – Noctis

+0

@Нокт, в то время как я чувствую, что это должен быть комментарий больше, чем ответ (слишком спекулятивный), мы оба представили наши сообщения одновременно, поэтому я не буду просить лицензионные платежи. – SJuan76

+0

Добавил это как комментарий, но только для того, чтобы уточнить, выбирая 'Distinct' из окончательного' List 'не меняет количество записей. –

Смежные вопросы