[C#] LINQ는 대소 문자를 구분하지 않습니다

이 코드는 대소 문자를 구분합니다. 대소 문자를 구분하지 않는 방법은 무엇입니까?

public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
    return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}



답변

여기서 문자열로 작업한다고 가정하면을 사용하는 또 다른 “우아한”솔루션이 IndexOf()있습니다.

public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
    return this.ObjectContext.FACILITY_ITEM
        .Where(fi => fi.DESCRIPTION
                       .IndexOf(description, StringComparison.OrdinalIgnoreCase) != -1);
}


답변

fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower())


답변

LINQ 쿼리가 데이터베이스 컨텍스트에서 실행되면 호출 Contains()LIKE연산자에 매핑됩니다 .

.Where(a => a.Field.Contains("hello"))
됩니다 Field LIKE '%hello%'. LIKE연산자는 기본적으로 케이스 둔감하지만 의해 변경 될 수 칼럼의 정렬을 변경 .

LINQ 쿼리가 .NET 컨텍스트에서 실행되는 경우 IndexOf ()를 사용할 수 있지만 해당 메서드는 LINQ to SQL에서 지원되지 않습니다.

LINQ to SQL CultureInfo를 매개 변수로 사용하는 메서드지원하지 않습니다 . 아마도 SQL Server가 .NET과 동일한 문화권을 처리한다고 보장 할 수 없기 때문일 것입니다. 지원 하지 않기 때문에 이것은 사실이 아닙니다 StartsWith(string, StringComparison).

그러나 LIKELINQ to SQL에서 평가하는 방법 과 .NET에서 대소 문자를 구분하지 않는 비교를 지원하지 않으므로 대소 문자를 구분하지 않는 Contains ()를 일관된 방식으로 수행 할 수 없습니다.


답변

여기서 허용되는 대답은 null 문자열이 있으면 ToLower ()에서 예외가 발생한다는 사실을 언급하지 않습니다. 더 안전한 방법은 다음과 같습니다.

fi => (fi.DESCRIPTION ?? string.Empty).ToLower().Contains((description ?? string.Empty).ToLower())


답변

LINQ to Objects에 대해 C # 6.0 (표현식 본문 함수 및 null 전파 허용)을 사용하면 다음과 같이 한 줄로 수행 할 수 있습니다 (null 확인).

public static bool ContainsInsensitive(this string str, string value) => str?.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0;


답변

이 경우 IndexOf가 가장 효과적입니다.

return this
   .ObjectContext
   .FACILITY_ITEM
   .Where(fi => fi.DESCRIPTION.IndexOf(description, StringComparison.OrdinalIgnoreCase)>=0);


답변

문자열을 사용할 수 있습니다.

    lst.Where(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0);

포함을 확인하려면 “Any”를 사용하십시오.

  lst.Any(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0)