Почему эти два запроса 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();

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

2 ответа

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


В вашем первом сценарии у вашего окончательного List есть дубликаты?

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

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

licensed under cc by-sa 3.0 with attribution.