質問

これがあります:

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)"には、ユーザーがページに入力したsortNameが動的に入力されます。

たとえば、ユーザーが<!> quot; Joe <!> quot;という名前の人を探している場合、スニペットは次のようになります。

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

しかし、LINQ Case-sensitive検索で問題が発生しています。 <!> quot; Joe <!> quot;と入力すると、何かします。一方、<!> quot; joe <!> quot;と入力しても、何も表示されません。

この<!> quot; Contains(sortName)<!> quot;を作成するにはどうすればよいですか?大文字と小文字を区別しないで動作しますか? String.Comparerでいくつか試してみましたが、ビルドソリューションでエラーが報告されます。

ありがとう!!

役に立ちましたか?

解決

以下が適切なSQLを生成すると信じています:

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

他のヒント

これが本当にLINQ-to-SQLである場合、 String.Containsの代わりにSqlMethods.Like メソッド

ただし、問題は式ツリーではなくデリゲートを使用しているため、これはLINQ-to-SQLではないことだと思います。したがって、これはクライアント側に移動され、ローカルで実行されます(<!> quot; LINQ to Objects <!> quot;)。したがって、String.Containsはローカルで行うことを実行しています。

そのように、Jamesの答えは正しいです。Jamesは値とクエリの両方でToLower()を呼び出しているからです。 (ただし、文化の問題に注意してください。おそらく、どの文化が必要かを指定してください。)

String.IndexOfメソッド(String、Int32、StringComparison)( http://msdn.microsoft.com/en-us/library/ms224424.aspx )。このメソッドを使用すると、大文字と小文字を区別してマッチングを行うかどうか、およびインバリアントカルチャを使用するかどうかを指定できます。

あなたの例では:

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

これがJames Curranが提供するものよりも良い解決策であるかどうかについてはコメントしていません。パフォーマンスに関しては、そうである場合とそうでない場合があります。

これはコード全体です:

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