Program Club

linq 대소 문자를 구분하지 않음 (toUpper 또는 toLower 제외)

proclub 2021. 1. 5. 08:21
반응형

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를 사용하고 싶습니다. 가능합니까?


String.Equals적절한 매개 변수와 함께 사용 하여 대소 문자를 구분하지 않습니다.

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

대신 방법을 ==사용하십시오 .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();

대 / 소문자를 구분하지 않는 데이터 정렬을 사용하는 데이터베이스에 대한 LINQ to SQL 쿼리 인 경우 이미 대 / 소문자를 구분하지 않습니다. LINQ to SQL은 실제로 == 호출을 실행하지 않습니다. 그것은 그것을 표현식으로보고 그것을 SQL의 같음 연산자로 변환합니다.

LINQ to Objects 인 경우 다른 포스터에서 지적한대로 String.Equals를 사용할 수 있습니다.


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


사용하다

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

C # 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 미만의 C #의 경우 다음과 같이 표시됩니다.

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

다음으로 변경

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();
}

데이터베이스에서 지원한다고 확신 하는 경우 string.Equals (name, article.Name, StringComparison.OrdinalIgnoreCase) 를 사용하십시오.

예를 들어, NOCASE의 대조를 가진 SQLite는 옵션을 무시합니다. Oracle은 취할 세션 설정 NLS_COMP, NLS_SORT를 사용합니다.

그렇지 않으면 문화 문제가 없을 때 ToLower () 또는 ToUpper ()를 사용하십시오.

참조 URL : https://stackoverflow.com/questions/5312585/linq-case-insensitive-without-toupper-or-tolower

반응형