문제

나는 이것을 가지고있다:

var sortName = Request.Params["sortName"];
var query = Request.Params["query"];

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).Contains(query));

그만큼 "uen.GetPropValue<string>(sortName)" 사용자가 페이지에 입력 한 정렬 이름으로 동적으로 채워집니다.

예를 들어, 사용자가 "Joe"라는 사람을 찾으면 스 니펫이 다음과 같습니다.

(uen => uen.namePerson.Contains(Joe))

그러나 LINQ 사례에 민감한 검색에 문제가 있습니다. "Joe"를 입력하면 뭔가 뭔가를 할 것입니다. 반면에, "Joe"를 입력하면 아무것도 가져 오지 않습니다.

이 "contation (sortname)"을 어떻게 케이스에 민감하게 만들 수 있습니까 ?? String.comparer로 몇 가지를 시도했지만 빌드 솔루션에 오류가보고됩니다.

감사!!

도움이 되었습니까?

해결책

다음은 적절한 SQL을 생성 할 것이라고 생각합니다.

 uen=>(uen.GetPropValue<string>(sortName)).ToLower().Contains(query.ToLower()))

다른 팁

이것이 실제로 LINQ-to-SQL이라면 사용해보십시오 sqlmethods.like 문자열 대신 메소드.

그러나 문제는 표현 나무 대신 대의원을 사용하고 있기 때문에 이것이 LINQ-to-SQL이 아니라는 것입니다. 따라서 이것은 클라이언트 측면을 가져온 다음 로컬로 실행됩니다 ( "Linq to Objects"). 따라서 String.contains는 현지에서하는 일을하고 있습니다.

그런 식으로 제임스의 대답은 값과 쿼리 모두에서 tolower ()를 호출하기 때문에 정확합니다. (문화 문제를 조심하지만 원하는 문화를 지정할 수도 있습니다.)

string.indexof 메소드 (String, int32, String Comparison)를 사용할 수도 있습니다.http://msdn.microsoft.com/en-us/library/ms224424.aspx). 이 방법을 사용하면 매칭을 대상으로 감지적으로 수행 해야하는지 여부를 지정할 수 있으며 불변 문화를 사용해야하는지 여부를 지정할 수 있습니다.

그래서 당신의 예에서 :

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).IndexOf(query, 0, StringComparison.OrdinalIgnoreCase));

나는 이것이 제임스 커란이 제공 한 것보다 더 나은 솔루션인지에 대해 언급하지 않습니다. 성능 현명 할 수도 있고 할 수 없었습니다.

이것은 전체 코드입니다.

var sortOrder    = Request.Params["sortorder"];    
var sortName     = Request.Params["sortname"];
var query        = Request.Params["query"];

IEnumerable<UsuarioEndereco> pagedEndereco;

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).Contains(query));
pagedEndereco = sortOrder.Equals("asc", StringComparison.CurrentCultureIgnoreCase) ?
                        _agendaServico.SelecionaUsuarioEnderecos(u.codUsuario).Where(whereClause).OrderByDescending(uen => uen.GetPropValue<IComparable>(sortName)) :
                        _agendaServico.SelecionaUsuarioEnderecos(u.codUsuario).Where(whereClause).OrderBy(uen => uen.GetPropValue<IComparable>(sortName));

확장 방법 GetPropValue는 다음과 같습니다.

public static T GetPropValue<T>(this object component, string propertyName)
{
    return (T)TypeDescriptor.GetProperties(component)[propertyName].GetValue(component);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top