2011-12-28 12 views
0

これら2つのクエリの違いは何ですか?LINQ to SQL結合クエリ0の代わりに1を返します

私はcodes1.Count()から1を取得していますが、codes2.Count()から1を取得していますが、両方とも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は、sourceが空の場合はデフォルト(TSource)を返します。それ以外の場合は、ソースの最初の要素(MSDN - http://msdn.microsoft.com/en-us/library/bb340482.aspx)を参照してください。 – adatapost

+0

しかし、なぜ0の代わりに1が得られるのですか? –

+0

あなたの最初のクエリも複雑ですが、 'user.SecurityCodesのコードから'暗示されているように、where句 'user.UsrUserName.Equals(code.UsrUserName)'の必要はありません。 .Equals –

答えて

2

FirstOrDefaultは、存在するかどうかにかかわらず常に正確に1つの要素を返します。したがって、2番目のクエリは常に要素を返します。 (各ユーザーに1つ)

+0

FirstorDefault()ではなくFirst()に変更しましたが、まだ別の結果を得ています –

+1

First is no結果がない場合にのみ例外となります。私はあなたが2番目のクエリで何をしたいのかを達成する前に言ったように、最初のものを単純化/修正して、最初のものを正しいものにする –

0

すべてのコレクションのFirstOrDefault()は、常に1つの結果を得ることを意味します。その結果は、最初に見つかった結果か、結果が見つからない場合のデフォルト値のいずれかになります。

FirstOrDefault()を削除するように2番目のクエリを変更した場合、両方のクエリのカウントで同じ結果が生成されます。

+0

2番目のクエリは、真っ直ぐに間違っています。FirstOrDefaultを削除すると、戻り値の型に一致しません。 –

+0

私はFirstorDefault()の代わりにFirst()だけを変更しましたが、別の結果を得ました。 –

関連する問題