이 코드는 대소 문자를 구분합니다. 대소 문자를 구분하지 않는 방법은 무엇입니까?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
이 코드는 대소 문자를 구분합니다. 대소 문자를 구분하지 않는 방법은 무엇입니까?
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())
IEqualityComparer<string>비교 작동 방식을 처리하기 위해 속성을 사용해야합니다 . 평등을 확인하기 위해 ToLower와 ToUpper를 사용하는 것은 나쁜 생각입니다. 시도 : .Contains(description, StringComparer.CurrentCultureIgnoreCase)예를 들어
Error 1 'string' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)' has some invalid arguments
Containswith StringComparer매개 변수로 문자열을받지 않으므로 빌드 오류가 발생합니다. IndexOf에 Queryable아마 SQL로 변환 할 수 없습니다. 개인적으로 나는이 답변이 LINQ to database에 대해 말할 때 완전히 유효한 것으로 나타났습니다.
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 ()를 일관된 방식으로 수행 할 수 없습니다.
insensitive검색 을 수행해야하며, 다른 상황에서는 그것이 필요합니다 case sensitive. 성능 저하를 가져 와서 'toLower ()'를 사용해야합니까?
여기서 허용되는 대답은 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)
public static bool Contains(this string input, string findMe, StringComparison comparisonType)
{
return String.IsNullOrWhiteSpace(input) ? false : input.IndexOf(findMe, comparisonType) > -1;
}
StringComparison.InvariantCultureIgnoreCase 는 나를 위해 일을합니다.
.Where(fi => fi.DESCRIPTION.Contains(description, StringComparison.InvariantCultureIgnoreCase));
String.Equals 메소드 사용
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION
.Equals(description, StringComparison.OrdinalIgnoreCase));
}