Подтвердить что ты не робот

Linq нечувствителен к регистру (без toUpper или toLower)

public Articles GetByName(string name, Categories category, Companies company)
{
    var query = from article in session.Linq<Articles>()
                where article.Name == name &&
                      article.Category == category &&
                      article.Company == company
                select article;
    return query.FirstOrDefault();
}

как запрос может быть нечувствительным к регистру. Я могу использовать toLower или toUpper, но хочу с OrdinalIgnoreCase. Возможно ли это?

4b9b3361

Ответ 1

Используйте String.Equals с соответствующими параметрами, чтобы сделать регистр нечувствительным

mySource.Where(s => String.Equals(s, "Foo", StringComparison.CurrentCultureIgnoreCase));

Ответ 2

Вместо == используйте метод .Equals(name, StringComparison.OrdinalIgnoreCase).

var query = from article in session.Linq<Articles>()
            where article.Name.Equals(name, StringComparison.OrdinalIgnoreCase) &&
                  article.Category.Equals(category) &&
                  article.Company.Equals(company)
            select article;

return query.FirstOrDefault();

Ответ 3

Если это запрос LINQ to SQL к базе данных без учета регистра без учета регистра, то он уже не учитывает регистр. Помните, что LINQ to SQL фактически не выполняет ваш вызов ==; он рассматривает это как выражение и преобразовывает его в оператор равенства в SQL.

Если LINQ to Objects, то вы можете использовать String.Equals, как указывали другие плакаты.

Ответ 4

var query = from article in session.Linq<Articles>()
           where string.Equals(article.Name,name, StringComparison.OrdinalIgnoreCase) &&
                 string.Equals(article.Category,category, StringComparison.OrdinalIgnoreCase) &&
                 string.Equals(article.Company,company, StringComparison.OrdinalIgnoreCase)
                        select article;

            return query.FirstOrDefault();

Он также будет обрабатывать, когда Name, Category, Company null

Ответ 5

Использование

String.Equals(article.Name, name, StringComparison.OrdinalIgnoreCase)

Ответ 6

Если вы используете С# 6.0, вы можете определить короткий метод расширения, который будет использоваться при построении операторов LINQ:

public static bool EqualsInsensitive(this string str, string value) => string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase);

Использование:

query.Where(item => item.StringProperty.EqualsInsensitive(someStringValue));

Для С# меньше 6.0 оно будет выглядеть так:

public static bool EqualsInsensitive(this string str, string value) 
{
    return string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase);
}

Ответ 7

Измените его на

public Articles GetByName(string name, Categories category, Companies company)
        {
    var query = from article in session.Linq<Articles>()
                            where string.Equals(article.Name, StringComparison.CurrentCultureIgnoreCase)  == name &&
                                string.Equals(article.Category, StringComparison.CurrentCultureIgnoreCase == category &&
                                string.Equals(article.Company, StringComparison.CurrentCultureIgnoreCase == company
                            select article;

                return query.FirstOrDefault();
}

Ответ 8

Используйте string.Equals(name, article.Name, StringComparison.OrdinalIgnoreCase), когда вы уверены, что ваша база данных поддерживает его.

например. SQLite с сопоставлением NOCASE игнорирует этот параметр. Oracle использует настройки сеанса NLS_COMP, NLS_SORT, которые будут приняты.

Если у вас нет проблем с культурой, используйте ToLower() или ToUpper().