2010-07-05 2 views
0

SQL Server 2008에 uniqueidentifier 필드가있는 테이블이 있습니다.SQL Server 2008 테이블에서 uniqueidentifier 값 검색

내 응용 프로그램 (C#, WPF)에서 GUID로 일부 데이터를 검색하기위한 텍스트 상자가 있는데, 사용자가 guid를 입력 할 수 있습니다. ctrl + v 등을 입력하면 오류가 발생할 수 있습니다.

linq2sql에서 공백을 무시하고 "-"... 다른 문자를 사용하여이 필드를 검색하는 가장 빠르고 가장 빠른 방법은 무엇입니까?

var d = from status in dc.FolderStatus.Where(status => status.Date <= DateTime.Now 
        && status.Folder.TapeCode.ToString().Replace("-", "") == tapeCode.ToUpper().Replace("-", "").Replace(" ", "") 
        ) 

TapeCode는 DBML 파일에서 SQL Server 2008 및 가이 드에서 uniqueidentifier입니다. 괜찮 니?

+1

복제하지 마십시오 태그입니다. 태그에 그냥 남겨주세요. –

+0

대리 키의 첫 번째 규칙은 무엇입니까? 가치를 최종 사용자에게 노출시키지 마십시오! – onedaywhen

답변

3

아니요, 매우 느립니다 (테이블 스캔을 수행하고 각 식별자를 문자열로 변환하고 문자열을 비교해야 할 것입니다).

tapeCode = Regex.Replace(tapeCode, "[^0-9a-zA-Z]+", ""); 
Guid id = Guid.Parse(tapeCode); 
var d = from status in dc.FolderStatus 
     where status.Date <= DateTime.Now 
      && status.Folder.TapeCode == id 
     select status; 

(Guid.Parse 방법은 유효한 입력으로 대시없이 32 자리의 16 진수 만 사용할 수 있습니다) 대신, 당신은 Guid에 입력 문자열을 변환하는 것을 비교해야합니다.

+1

(Guid.Parse가 .NET 4에 도입되었습니다. 이전에는 생성자를 호출해야했습니다.) –

+0

@Jon : Oooooh, 그래서 Reflector에서 찾을 수 없었습니다. 숫자 형식), 나는 미쳤다고 생각했다 :) –

0

SQL의 uniqueidentifier 필드 인 경우 LINQ to SQL의 네이티브 지원을 기대합니다. 난 당신이 할 수있을 것으로 판단 :

Guid tapeCode = new Guid(text); 
var d = from status in dc.FolderStatus 
     where status.Date <= DateTime.Now && status.Folder.TapeCode == tapeCode 
     select ...; 

이제 text가 유효한 GUID를 나타내지 않는 경우 예외가 발생합니다 물론. 당신이 .NET 4를 사용하는 경우, 당신은 같은 방법으로 Guid.TryParse을 사용할 수 있습니다 당신은 것 구문 분석 정수 등을 위해 :

Guid tapeCode; 
if (Guid.TryParse(text, out tapeCode)) 
{ 
    var d = from status in dc.FolderStatus 
      where status.Date <= DateTime.Now && 
        status.Folder.TapeCode == tapeCode 
      select ...; 
} 
else 
{ 
    // Handle invalid input 
} 
0

당신이 시도하고이 실제로 얻을 것 같이 SQL 필드에 .Replace을하지 말아야 매우 느린 서버에서 실행됩니다.

메소드로 들어오는 데이터를 마사지해야합니다.

즉 제목에 (C 번호) 등의

public void GetFoo(string guid) 
{ 
    string sqlGuid = guid.ToString().Trim().Replace("-", ""); 

    var d = from status in dc.FolderStatus.Where(status => status.Date <= DateTime.Now && 
                  status.Folder.TapeCode == sqlGuid); 
}