3

データベースからユーザーのリストをフィルタリングしようとしています。

この LINQ to Entity コマンドを実行すると、期待どおりに動作します。にあるものでフィルタリングされたすべてのユーザーを返しますtxtFilterBy_UserName

(db テーブルに直接アクセスしていることに注意してください。フィルタリングするフィールドもいくつかありますが、この例ではユーザー名のみを含めています)

users = db.Users
          .Where(u => u.IsActive == true &&
                      u.UserName.ToLower()
                       .Contains((txtFilterBy_UserName.Value.Length > 0) ? 
                                  u.UserName.ToLower() : 
                                  txtFilterBy_UserName.Value.ToLower()))
          .ToList();

しかし...状況によっては、フィルタリングする前に User コレクション ( _users) を既に作成しており、これを実行できると期待していました。

users = _users.Where(u => u.IsActive == true && 
                          u.UserName.ToLower()
                           .Contains((txtFilterBy_UserName.Value.Length > 0) ?
                                      u.UserName.ToLower() :
                                      txtFilterBy_UserName.Value.ToLower()))
              .ToList();

しかし、このメソッドは常に 0 ユーザーを返します。誰かが私が間違っていることを教えてもらえますか、またはユーザー コレクションをフィルタリングするこのメソッドが機能しない理由を教えてください。

私のDBに100人のユーザーがいて、そのうち6人のユーザーがユーザー名に「john」という文字を持っているとしましょう。DB に直接クエリを実行すると、6 人のユーザーが返されます。ユーザー コレクション オブジェクトが既に (100 ユーザーで) 読み込まれていて、コレクションをフィルター処理しようとすると、0 ユーザーが返されます

4

3 に答える 3

2

フィルタリングに三項演算子を使用する代わりに、条件付きでWhereフィルターを追加してクエリを作成するだけです。

var query = _users.Where(u => u.IsActive); // don't compare boolean with true
if (txtFilterBy_UserName.Value.Length > 0)
    query = query.Where(u => u.UserName.ToLower().Contains(txtFilterBy_UserName.Value.ToLower()));

var users = query.ToList();

はい、@Abbasに同意します-クエリは問題ないようです。_usersおそらく、ローカルコレクションに条件に一致するユーザーがいない可能性があります。

于 2013-06-20T10:21:05.337 に答える
1

クエリが少し混乱しているようです。あなたのコードを見て、私はあなたがこれをしたいと思う:

  1. txtFilterBy_UserName.Value.Length > 0true の場合、ユーザー名に が含まれるユーザーのみを返しますtxtFilterBy_UserName.Value。基本的に、フィルタリングを行います。
  2. txtFilterBy_UserName.Value.Length > 0false の場合、すべてのユーザーを返します。ここでは、フィルターを適用しません。

私の仮定が正しければ、次のようにクエリを書き直すことができます。

users = db.Users.Where(u => u.IsActive == true);

if (txtFilterBy_UserName.Value.Length > 0))
{
    users = users.Where(u => u.UserName.ToLower().Contains(txtFilterBy_UserName.Value.ToLower()));
}

users = users.ToList();
于 2013-06-20T10:22:18.370 に答える
1

コレクション_usersにユーザーが含まれているか (フィルタリング前)? また、あなたのクエリは奇妙に見えます。間違っている場合は修正してください。

u.UserName.ToLower().Contains((txtFilterBy_UserName.Value.Length > 0)
                              ? u.UserName.ToLower()
                              : txtFilterBy_UserName.Value.ToLower())

私はこれを次のように読みます:

filter-textbox に値 (Length > 0) がある場合、ユーザーの小文字のユーザー名にそのユーザーの小文字のユーザー名が含まれているすべてのユーザーを教えてください。それ以外の場合 (フィルター値が指定されていない場合)、小文字のユーザー名には空の値 (文字列) が含まれています。

于 2013-06-20T10:17:04.100 に答える