2009-12-05 5 views
5

Linq와 Sql 문자열 비교에 대해 모순되는 설명을 읽었습니다.Linq to Sql 대소 문자를 구별하지 않는 평등

다음 작업을 수행 할 때 :

from p in db.People 
    where p.UserName=username 
    select p 

이름 = "존"

나는 정확한 대소 문자를 구분 결과를 얻을. Linq가 기본적으로이 작업을 수행하고 있습니까? 아니면 SQL 데이터베이스에서이 문제가 발생 했습니까?

+0

일부 인용문이 누락 되었습니까? 변수 이름의 대/소문자를 변경해도 결과에는 영향을 미치지 않습니다. –

+0

위의 내용이 맞지 않습니다. – zsharp

답변

4

db 변수가 가리키는 값과 비교가 실제로 실행되는 위치에 따라 충돌하는 결과가 발생한다고 생각합니다. 가능한 경우 linq는 쿼리를 작성하여 SQL 서버로 보냅니다.

선택 [T0] .col1, [T0] .col2, ..., [: 당신은 대략 이런 식으로 뭔가를 변환합니다

where p.UserName.ToLower()=username.ToLower() 
+1

죄송합니다. 그러나 이것은 좋은 조언이 아닙니다. p.UserName.ToLower() = username.ToLower()는 전체 테이블을 강제로 검사 할 SQL 쿼리로 변환합니다. "people"테이블이 작은 지 여부는 중요하지 않지만 큰 테이블 인 경우 'username'열을 포함 할 수있는 인덱스를 사용할 수 없습니다. – KristoferA

1

데이터베이스에 따라 다릅니다. SQL Server 2008에서는 문자열을 인덱스 식에서 사용할 때를 포함하여 대/소문자를 구분하지 않습니다. 린크는 그렇게하지 않습니다.

on MSDN 또는 this article을 읽으십시오.

+2

대/소문자 구분 여부는 데이터베이스 및/또는 관련된 열 (SQL Server가 설치 될 때 기본값으로 설정되지만 여러 위치에서 아래로 컬럼 레벨). – KristoferA

3

샘플 쿼리를 호출하여 대소 문자를 구분을 강제 할 수 것 같다 [스키마]에서 .coln T0]. [사람] [(T0)] = @ .UserName P0

...을 자명 변수의 값은 P0에서 @의 SQL 변수 전달한다 . 따라서 대/소문자 구분, 액센트 구분 등은 SQL Server 인스턴스/db/table/column을 사용하도록 설정 한 데이터 정렬에 의해 제어됩니다. 다른 곳에서는 지정하지 않으면 DB 또는 DB 인스턴스의 기본 데이터 정렬이 사용되지만 데이터 정렬은 열 수준까지 계속 지정 될 수 있습니다.

대다수 사람들은 대소 문자를 구분하지 않는 (CI) 데이터 정렬을 사용하여 SQL Server를 실행하지만 위에서 말한 것처럼 데이터베이스에서 재정의 될 수 있으므로 사용자가 거기에있는 데이터 정렬을 확인하면됩니다.

이것은 L2O (객체에 대한 linq) 쿼리와 동일한 작업을 수행하는 것과는 대조적입니다.이 경우 대소 문자 구분이 기본값이므로 string.equals 무시를 사용하여 대소 문자를 구분하지 않으면 안됩니다 문화 및/또는 무감각을 지정할 수 있습니다. ...

+0

string.equals 재정의를 사용하지 않을 경우 내 결과에 댓글을다는 데 문제가 있습니까? 비교를 수행하려면 모든 레코드를 linq쪽으로 이동하십시오. –

+0

@Jeff, string.equals 참조는 L2S와 L2O의 동작 방식을 비교 한 것입니다. 그 점에 대해 명확하지 않은 경우 미안합니다. 하지만 네가 둘을 결합하여 클라이언트 측에서 L2O 쿼리로 평가할 경우 모든 레코드를 가져올뿐만 아니라 와이어를 통해 보낼 수도 있습니다. 즉, 올바른 데이터 정렬을 사용하는 것이 중요합니다. 답장의 예제는 여전히 데이터베이스에서 평가되지만 왼쪽 부분 where 절 술어에 함수 호출 랩퍼로 인해 테이블 ​​스캔의 추가 오버 헤드가 있습니다. – KristoferA

+0

응답 해 주셔서 감사합니다 (이전에 +1을했을 때 +1했습니다). –

관련 문제