2011-12-28 2 views
0

В чем разница между этими двумя запросами?LINQ to SQL Присоединение Query возвращает 1 вместо 0

Я получаю 0 из кодов1.Count(), но 1 из кодов2.Count(), но это должно быть 0 для обоих.

IQueryable<SecurityCode> codes1 = (from user in dataBase.SecurityUsers 
         from code in user.SecurityCodes 
         where user.UsrUserName.Equals(code.UsrUserName) 
           && user.UsrPhone.Equals(phone) 
         select code); 


IQueryable<SecurityCode> codes2 = (from user in dataBase.SecurityUsers 
           where user.UsrPhone.Equals(phone) 
         select user.SecurityCodes.FirstOrDefault()); 

Связь отображается ниже

Любое объяснение будет высоко оценен.

+2

FirstOrDefault возвращает значение по умолчанию (TSource), если источник пуст; в противном случае первый элемент в источнике (от MSDN - http://msdn.microsoft.com/en-us/library/bb340482.aspx). – adatapost

+0

, но почему я должен получать 1 вместо 0? –

+0

также ваш первый запрос сложнее, нет необходимости в where where 'user.UsrUserName.Equals (code.UsrUserName)', как это подразумевается 'от кода в user.SecurityCodes' также == следует использовать вместо .Equals –

ответ

2

FirstOrDefault всегда будет возвращать ровно 1 элемент, независимо от того, существует ли он. поэтому ваш второй запрос всегда будет возвращать элементы. (по одному для каждого пользователя)

+0

я изменил второй запрос только на First() вместо FirstorDefault(), но все же у меня получился другой результат. –

+1

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

0

FirstOrDefault() в любой коллекции означает, что вы всегда получите один результат. Этот результат будет либо первым встреченным результатом, либо значением по умолчанию, если результат не был найден.

Если вы изменили второй запрос, чтобы исключить FirstOrDefault(), подсчеты из обоих запросов должны давать одинаковый результат.

+0

Второй запрос на самом деле просто неправильно, удаление FirstOrDefault просто приведет к тому, что он не будет соответствовать типу возврата. –

+0

Я изменил второй запрос только на First() вместо FirstorDefault(), но все же у меня получился другой результат. –