Frage

Ich habe diese:

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

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

Die "uen.GetPropValue<string>(sortName)" wird der Benutzer auf der Seite eingegeben dynamisch mit dem sortName gefüllt werden.

Zum Beispiel, wenn ein Benutzer für eine Person namens "Joe" sieht, wird das Snippet sein:

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

Aber ich habe Probleme mit LINQ Case-sensitiven Suchanfrage mit. Wenn ich „Joe“ geben, werde ich etwas. Auf der anderen Seite, wenn ich „joe“ geben, es nichts bringen.

Wie kann ich diese „Enthält (sortName)“ arbeitet mit Groß- und Kleinschreibung ?? Ich habe ein paar Dinge mit String.Comparer versucht, aber es meldet Fehler beim Erstellen der Lösung.

Danke !!

War es hilfreich?

Lösung

Ich glaube, die folgende richtige SQL generieren:

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

Andere Tipps

Wenn diese LINQ-to-SQL ist wirklich, versuchen Sie die SqlMethods.Like Methode anstelle von String.Contains.

Aber ich denke, das Problem ist, dass diese LINQ-to-SQL ist nicht, weil Sie Delegierten statt Expression Bäume verwenden. So wird diese gebracht Client-Seite ist, dann lokal ausgeführt ( "LINQ to Objects"). Daher String.Contains tut, was es vor Ort der Fall ist.

Auf diese Weise James Antwort ist richtig, denn er ruft ToLower () auf beide den Wert und die Abfrage. (Obwohl, passen sie von Kulturfragen -. Vielleicht angeben, welche Kultur Sie wollen)

Sie können auch die String.IndexOf-Methode (String, Int32, StringComparison) verwenden ( http://msdn.microsoft.com/en-us/library/ms224424.aspx ). Mit dieser Methode können Sie festlegen, ob der passende sollte Fall sensitiv oder nicht getan werden, und wenn es eine unveränderliche Kultur verwendet werden soll oder nicht.

So in Ihrem Beispiel:

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

Ich bin Kommentierung nicht auf, wenn dies eine bessere Lösung als die von James Curran vorgesehen ist. Es könnte oder könnte nicht sein, Leistung klug.

Dies ist der gesamte Code:

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

Die Erweiterungsmethode GetPropValue ist:

public static T GetPropValue<T>(this object component, string propertyName)
{
    return (T)TypeDescriptor.GetProperties(component)[propertyName].GetValue(component);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top