이 코드는 대소 문자를 구분합니다. 대소 문자를 구분하지 않는 방법은 무엇입니까?
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)
.
그러나 LIKE
LINQ 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)
