Поиск уникального значения идентификатора в таблице SQL Server 2008 - PullRequest
0 голосов
/ 05 июля 2010

У меня есть таблица в 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 - это uniqueidentifier в SQL Server 2008 и Guid в файле dbml. Это нормально?

Ответы [ 3 ]

3 голосов
/ 05 июля 2010

Нет, это будет очень медленно (придется сканировать таблицу, конвертировать каждый идентификатор в строку и сравнивать строку).Вместо этого вам придется преобразовать входную строку в Guid и сравнить это:

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 шестнадцатеричные цифры без черточек в качестве допустимого ввода).

0 голосов
/ 05 июля 2010

Вы не должны пытаться делать .Заменить поле SQL, так как это на самом деле будет выполняться на сервере, что очень медленно.

Вам следует помассировать данные, поступающие в ваш метод.

* 1005 т.е. *

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);
}
0 голосов
/ 05 июля 2010

Если это поле uniqueidentifier в SQL, я бы ожидал встроенную поддержку в 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
}
...