2

現在、コントローラー内で次のコードを使用しています。

Instructor instructor = db.Instructors.FirstOrDefault(
    o => o.UserName == User.Identity.Name);

ユーザー名で誰かを選択します。私の理解では、同じようなユーザー名のユーザーがいる場合、「FirstOrDefault()」の使用に問題が発生します(つまり、「MrUserOne」、「MrUserTwo」、「MrUser」という名前のユーザーがいるときに「MrUser」を検索すると、「MrUserOne」が生成される可能性があります。表示されるのは「最初の」検索結果でした)、「FirstOrDefault」の将来の問題についての理解が正しければ、その場所で何を使用すればよいですか?

または、FirstOrDefaultがどのように機能するかについての理解が間違っていますか?

4

4 に答える 4

8

==このシナリオでオペレーターがどのように機能するかを完全に理解していないようです。との値が両方であると仮定するUserNameと、正確な序数の一致が行われます。名前はまったく一致しません。一致するだけです。 Namestring=="MrUser""MrUserOne""MrUser"

そうは言っても、このコードは、値が完全に一致する最初のユーザーを返すか、Name一致しない場合は最初のユーザーを返します。 o.UserNamenull

于 2012-04-18T20:46:18.693 に答える
5

JaredParは、彼の言っていることが非常に正しいです。ただし、期待する結果が1つだけの場合は、SingleOrDefaultを使用することもできます。詳細については、Stackoverflowの質問をご覧ください。LINQ :フィルタリング基準でSingleOrDefaultとFirstOrDefault()を使用する場合

于 2012-04-18T20:51:29.407 に答える
3

==を使用すると、正確な検索結果がすでに実行されています。表現

o => o.UserName == User.Identity.Name

に翻訳されます

WHERE UserName = [Username]

データベース側。これは、次のようなステートメントと混同しないでください。

o => o.UserName.Contains(User.Identity.Name)

これは次のように解釈されます

WHERE UserName like '%[Username]%'

Linqからエンティティへの文字列関数の変換方法については、 http://msdn.microsoft.com/en-us/library/bb738681.aspxを参照してください。

そうは言っても、FirstOrDefaultは、指定したユーザー名と完全に一致する名を提供します。したがって、この例では、「MrUser」という名前の最初のユーザーと一致します。

于 2012-04-18T20:49:32.237 に答える
3

クエリは、完全に一致する最初のユーザーを返すだけUserNameです(あなたが言っているように、User.Identity.Nameで始まるユーザーとは一致しません)。User.Identity.Name

したがって、同じ名前のユーザーが2人いる場合、戻り値は最初のユーザーになります。また、「最初の」ものは、​​結果を返すときにデータベースがどのように感じるかによって異なる場合があります(順序を指定していないため)。

ちなみに、これらの4つの同様の方法に精通している必要があります。これらは、知っておく価値があります。

                   >1 result     0 results
First()            return 1st    throw
FirstOrDefault()   return 1st    return null
Single()           throw         throw
SingleOrDefault()  throw         return null
于 2012-04-18T20:52:29.343 に答える