2012-04-18 64 views
2

나는 현재 내 컨트롤러 내에서 다음 코드를 사용하고 있습니다 :데이터베이스에서 정확한 검색 결과를 찾으려면 "FirstOrDefault()"대신 무엇을 사용합니까?

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

이 이름으로 사람을 선택할 수 있습니다. 내 이해는 사용자가 비슷한 사용자 이름 (예 : "MrUserOne" "MrUserOne"및 "MrUserOne"이라는 사용자가있을 때 "MrUser"를 검색하면 "FirstOrDefault()"를 사용하는 데 문제가있을 것입니다. 왜냐하면 "MrUserOne" "FirstOrDefault"로 미래의 어려움에 대한 나의 이해가 정확하다면, 그 장소에서 무엇을 사용해야합니까?

아니면 FirstOrDefault가 작동하는 방법에 대한 나의 이해가 잘못 되었습니까?

답변

8

== 연산자가이 시나리오에서 어떻게 작동하는지 잘 알지 못합니다. UserNameName 값이 모두 string이라고 가정하면 ==은 정확한 순서 매치를 수행합니다. "MrUser"이라는 이름은 "MrUserOne"과 전혀 일치하지 않습니다. "MrUser"과 일치합니다.

이 코드는 값이 정확히 o.UserName 또는 null과 일치하는 첫 번째 사용자를 반환합니다.

+0

당신에게 내가 알 필요가 정확히 무엇을 = 대단히 감사합니다. – Ecnalyr

+0

First() 또는 Single()도 사용할 수 있습니다. FirstOrDefault는 일치하는 항목이 없을 경우 기본 빈 객체를 반환합니다. 이 동작은 First 또는 Single의 반대쪽에 Exeption을 던지지 않도록합니다. 일치하지 않으면 오류가 발생합니다. –

3

==를 사용하면 이미 정확한 검색 결과를 얻고있는 것입니다. 식

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

데이터베이스 측

WHERE UserName = [Username] 

로 변환된다. 이것은

WHERE UserName like '%[Username]%' 

는 문자열 함수는 엔티티 Linq에 대한 변환하는 방법에 대한 http://msdn.microsoft.com/en-us/library/bb738681.aspx를 참조하십시오 번역 것이다

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

같은 문으로 혼동되지 않습니다.

그렇다면 FirstOrDefault는 사용자가 제공 한 사용자 이름과 정확하게 일치하는 이름을 제공합니다. 그래서 당신의 예제는 첫 번째 사용자와 "MrUser"라는 이름을 매치시킬 것입니다.

+0

나는 당신이'UserName = [Username]'을 의미한다고 믿는다. - 당신은 SQL 단편에 단 하나가 아닌 이중 같음 연산자를 가지고있다. –

+0

실제로. 캐치 주셔서 감사합니다! – villecoder

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 
+0

감사합니다. 매우 도움이되는 테이블. – Ecnalyr

관련 문제