оператор. Благодарю вас.

олчанию ODataController выполняет поиск с учетом регистра. Как мы расширяем это поведение для выполнения поиска без учета регистра.

public class NammaODataController : ODataController
{

    [EnableQuery]
    public IQueryable<FD> GetFD(ODataQueryOptions qo)
    {
        return _ctx.FDs.AsQueryAble();
        //EF takes care to apply odata query operators internally 
        //after control passes from action
    }
}

Я сослалсяэто ТАК кажется, мы можем использовать Expression Tree, но в какой точке расширяемости?

Можно ли как-то перехватить запрос и настроить EF / Web Api piplelie для достижения этой цели?

Вот пример: / FD? $ Filter = tolower (Pr_Name) eq tolower ('TAMARA') - это должно вернуть всех людей с именем 'Tamara' (без учета регистра, может быть 'TAMARA', 'tamara', 'Tamara', и т.д. Надеюсь, что это поможет, выдвинуть мою точку зрения.

РЕДАКТИРОВАТЬ:

Чувствительность к регистру вODATA Web API queries не имеет ничего общего с SQL Collation. Это было проблемой с платформой Microsoft OData.

С подстрокой оператора

void Main()
{
    var lower = _ctx.FD
    .Where(sv => sv.Pr_Name.Contains("tamara"))
    .Take(1)
    .ToList();
    Console.WriteLine("LOWER CASE AZURE SQL OUTPUT");
    Console.WriteLine(lower);

    Console.WriteLine("UPPER CASE AZURE SQL OUTPUT");
    var upper = _ctx.FD
    .Where(sv => sv.Pr_Name.Contains("TAMARA"))
    .Take(1)
    .ToList();
    Console.WriteLine(upper);
}

С участиемeq оператор

void Main()
{
    var lower = FD
        .Where(sv => sv.Pr_Name == tamara A TOPOLESKI")
        .Take(1)
        .ToList();
    Console.WriteLine("LOWER CASE AZURE SQL OUTPUT");
    Console.WriteLine(lower);

    Console.WriteLine("UPPER CASE AZURE SQL OUTPUT");
    var upper = FD
        .Where(sv => sv.Pr_Name == "TAMARA TOPOLESKI")
        .Take(1)
        .ToList();
    Console.WriteLine(upper);
}

 Abhijeet02 нояб. 2017 г., 06:27
@ThomasKoelle, IMHO сортировка БД не поможет, так как здесь используется команда ODATA, даже если мы повернем таблицы БД для выполненияCase-Insensitive Конвейер ODATA преобразует его в чувствительный к регистру фильтр.
 Thomas Koelle01 нояб. 2017 г., 15:42
Вы уверены, что это не база данных? быстрый способ проверить поле - написать: «sp_help FD», то в сопоставлении естьCS это чувствительно к регистру. Я никогда не пробовал, где это OData, который решил это.

Ответы на вопрос(1)

редактировать

проблема не связана с вашим сопоставлением. Это связано с выражением odata, которое вы используете. В вашем обновленном тестовом запросе вы используетеContains который переводится вLIKE с джокерами (любая строка от нуля или более символов) в любом конце поискового значения. Тем не менее, в вашем выражении odata вы используетеeq который будет переведен в= в выражении EF, а затем снова в запросе SQL. КакPr_Name значения, которые вы указали в выходных данных, не совсем равны"Tamara" но содержат"Tamara" запросы odata не вернут никаких данных.

Что вам нужно, это выражение фильтра odatasubstringof который будет переведен EF вContains который переводится в SQL дляLIKE с подстановочными знаками по обе стороны от значения поиска.

/FD?$filter=substringof(Pr_Name,'tamara')

Для более выражений фильтра обратитесь кИспользование выражений фильтра

Как@ThomasKoelle указано в комментариях, это связано с сопоставлением столбца (ов). Конвейер OData (вы определили выше) использует Entity Framework, который преобразует переданное выражение в запрос к базе данных. Таким образом, выражение OData не имеет к этому никакого отношения, равно как и встроенный запрос EF.

Если у вас есть сортировка с учетом регистра, вам придется сделать все ваши поисковые термины и столбцы поиска одним и тем же случаем, что очень плохо сказывается на производительности, потому что эти условия поиска не будут SARGable.

Для большинства СУБД сортировка столбца наследуется от сортировки по умолчанию базы данных, которая наследуется от сортировки по умолчанию экземпляров. Вы можете переопределить на каждом уровне, но это должно быть сделано явно во время определения экземпляров (схема / база данных).

 Abhijeet03 нояб. 2017 г., 12:52
Содержит, я просто взял в качестве примера, SQL чувствителен к регистру дажеeq оператор. Благодарю вас.
 Abhijeet03 нояб. 2017 г., 06:57
Обновлено. & проверено на основе ваших советов, спасибо.
 Igor03 нояб. 2017 г., 09:56
@Abhijeet - я обновил свой ответ, он должен работать для вас также на основе вашего предыдущего теста и показанных результатов.
 Abhijeet02 нояб. 2017 г., 14:34
спасибо @Igor, я подтвердил с MS,The default collation of Azure SQL DB is - SQL_Latin1_General_CP1_CI_AS. This indicates Case Insensitive collation, - AFAIK Никаких действий не требуется на сопоставление.
 Igor02 нояб. 2017 г., 14:43
@Abhijeet посмотрите мое обновление и, пожалуйста, посмотрите на добавленную ссылку, это может быть напрямую связано с вашей проблемой.

Ваш ответ на вопрос