2017-04-17 17 views
0

私はこのコードをデータベース検索の対象としています。ユーザーには、ここでは3つのオプションがあります。姓のみを入力するには、名とユーザーの両方を使用して姓と名を検索できます。検索の必須フィールドではありません

このコードは、文字列(姓と名)の両方を指定すると、dbからレコードを取得します。しかし、私がそれらのうちの1つだけを入力すると、結果リストは常に空です。あなたはToList WTHデータを実体または例えばそれを反復するまで

var query = from x in db.people 
        where (txtSurname == null || x.Surname== txtSurname.Text) 
         && (txtFirstName == null || x.FirstName == txtFirstName.Text) 
        select x; 
     var data = query.ToList(); 
     peopleBindingSource.DataSource = data; 

答えて

5

は、Entity Frameworkのクエリがデータベースに送信されないことに注意してください。これは、次のようなコードでクエリを構築できることを意味します。

var query = db.people.AsQueryable(); 

if(!string.IsNullOrEmpty(txtSurname.Text)) 
{ 
    query = query.Where(p => p.Surname == txtSurname.Text); 
} 

if(!string.IsNullOrEmpty(txtFirstName.Text)) 
{ 
    query = query.Where(p => p.FirstName == txtFirstName.Text); 
} 

peopleBindingSource.DataSource = query.ToList(); 
+1

この方法を使用すると、より良いキャッシュされたクエリプランも作成される可能性が高くなります。ほとんどのフィールドが使用されていない場所で前の実行からのパラメータスニッフィングのために悪いインデックスを取得することはありません。 –

+0

質問で比較チェックが行われている場合、これはまったく同じではありません。 if(txtSurname == null)の場合、if(txtSurname.Text)のみをチェックします。 – David

+0

@Davidはい、それは最初の場所で元の問題を引き起こしたタイプミスだと思われます。 – DavidG

関連する問題