1

「LINQtoEntities」クエリを実行するC#アプリケーションがあります。

接続しているデータベースはMSSQL2012です。データベース照合は「ヘブライ語CI」です。

それでも、次のようなクエリを実行すると、次のようになります。

return users.Where(us => us.FirstName.Contains("joh"));

'John'を持つ'FirstName'のレコードはフェッチされません。名が「john」のもののみ。

これはSQLServer側でデータベースの照合によって決定されると思いましたが、明らかに私は間違っています...

また、「FirstName」列の照合を確認しましたが、「DatabaseDefault」に設定されています。

ここで何が欠けていますか?

[ アップデート ]

いくつかのコメントを読んだ後-私は明確にする必要があります:

ローカルクエリではなく、LINQ-TO-ENTITIESを使用しています。

コードの完全な部分は次のとおりです。

public List<User>   GetUsersByName(IMyDBEntities context, String filterBy)
{
    IEnumerable<User> users = context.Users;

    return users.Where(us => us.FirstName.Contains("filterBy"));  // filterBy = 'joh'
}

完全な関数には、より多くのフィルターが含まれています(年齢によるフィルター、住所によるフィルターなど)。

これはすべてユーザーの「サーバー」リストで発生し、「。ToList()」を実行した場合にのみ、クエリは実際にすべてのフィルターで実行されます。

4

3 に答える 3

1

おそらく、ローカルコレクションでこのWhere呼び出しを実行しています。つまり、LINQtoObjectsセマンティクスを取得します。データベースクエリに移動する必要があります。

更新されたコードを見ると、問題は明らかです。

IEnumerable<User>

シーケンス変数をクエリではなくローカルシーケンスとして宣言することにより、コンパイラにリモートクエリ演算子ではなくローカルクエリ演算子を使用させることができます。

コンパイル時の型はである必要がありますIQueryable<User>

于 2012-08-18T10:29:32.730 に答える
0

これを実現する1つの方法は次のとおりです。

return users.Where(us => us.FirstName.ToLower().Contains("joh"));
于 2012-08-18T10:29:01.840 に答える
0

このlinqがsqlにマップされている場合、sqlサーバー設定が使用されます...ただし、この場合、users既にオブジェクトのリストになっているため(そうでない場合、文字列比較はデータベースサーバーに依存します)、次のように実行できます。

return users.Where(us => us.FirstName.Contains("joh", StringComparer.OrdinalIgnoreCase));
于 2012-08-18T13:04:10.183 に答える