2015-09-24 10 views
0

У меня есть код, который проверяет наличие двух строк на БД. Проблема в том, что он будет игнорировать корпус, поэтому abc123 будет таким же, как ABC123. Мне это не понравится. Я хочу, чтобы пользователь точно вводил строки.String "nfnfn" соответствует "nFnFN" и возвращает true - я хочу, чтобы он возвращал false

Это мой код:

public bool Consultant(string test, string test2) 
{ 
    return db.Consultants.Any(x => x.Test == test && x.Test2 == test2); 
} 

Не с помощью запроса, метод генерации один для меня.

+0

Я полагаю, этот код переводится в некоторый запрос базы данных. В этом случае вступает в игру сортировка базы данных. Если эта сортировка нечувствительна к регистру, у вас нет возможности отличить эти две строки от вашего примера на стороне базы данных. Единственный способ - изменить сортировку на регистр, чувствительный к регистру, но это повлияет на все сравнения, сделанные на стороне БД. –

+1

Возможный дубликат [Как сделать чувствительный к регистру поиск в предложении WHERE (я использую SQL Server)?] (Http://stackoverflow.com/questions/1831105/how-to-do-a-case-sensitive- search-in-where-clause-im-using-sql-server) – ieaglle

+0

Это будет невозможно, если вы не сможете переопределить сортировку базы данных каким-то образом, потому что именно там происходит это сопоставление. LINQ преобразуется в SQL, поэтому сервер обрабатывает логику соответствия. – code4life

ответ

2

Я предполагаю, что этот запрос транслируется в SQL и что база данных использует регистрозависимость сверку.

Существует несколько способов решения этой проблемы.

  1. Измените определение базы данных, чтобы использовать сортировку, чувствительную к регистру.
  2. Pass сверки как часть запроса

    Ваш ORM не поддерживает это, и это могло бы предотвратить использование индекса, если индекс использует различные параметры сортировки.

    Брэдли Uffner связан способ сделать это для EF: Case sensitive search using Entity Framework and Custom Annotation

  3. Pre-фильтр в базе данных (чувствительно к регистру), чтобы сократить количество результатов эффективно. Затем в качестве второго шага фильтр строго использует LINQ-to-objects.

    public bool Consultant(string test, string test2) 
    { 
        var candidates = db.Consultants.Where(x => x.Test == test && x.Test2 == test2); 
        return candidates.AsEnumerable().Any(x => x.Test == test && x.Test2 == test2); 
    } 
    

    Не забудьте добавить комментарии, если вы используете этот подход, поскольку это вряд ли интуитивно.

    Этот способ обычно уступает альтернативам, поэтому их следует отдать предпочтение, если они доступны.

+0

Интересно, почему это произошло. –

+1

Это правильный подход. потому что, если мы попытаемся заставить 'COLLATE' использовать .net' ObjectQuery', тогда он будет вызывать ошибку, если соответствующие записи не найдены. В противном случае, я не знаю другого пути, кроме этого. – Piyush

+0

@ P.K. О каком из трех подходов вы имеете в виду? – CodesInChaos

-1

Вы должны сделать чувствительный поиск, как следующее:

public bool Consultant(string test, string test2) 
{ 
    return db.Consultants.Any(x => String.Compare(x.Test, test, false) == 0 && String.Compare(x.Test2, test2, false) == 0); 
} 
+1

с использованием LINQ-to-entity это не сработает – ieaglle

+0

@ieaglle Почему, по вашему мнению, это не сработает? Сравнение выполняется на передней панели с использованием C#, поэтому оно должно быть законным. – Piyush

+1

@ P.K. Нет, сравнение * не * выполняется приложением. Он интерпретируется поставщиком запросов EF, который не знает, как перевести его в SQL, чтобы он выдавал исключение. – Servy