2012-04-05 5 views
7

私はlinqクエリを持っています。私は、ユーザーが検索しているフィールドに基づいてフィルタリングする必要がある場所から収集したフォームからパラメータを取得しています。Linqオプションのパラメータ

IQueyable<Users> user = from user in edmxObject.Users 
where user.FirstName.Contains(model.FirstName ?? user.FirstName) 
&& user.UserName.Contains(model.UserName ?? user.UserName) 

私はlongとbooleanを含むフィルタリングが必要な非文字列フィールドフィルタがいくつかあります。ユーザーが何も選択しなかった場合、それらはNULLになる可能性があります。どのようにそれらをクエリに含めるか。

+0

このリストは不明ですか?何らかのクエリビルダーのようなもの? – Jodrell

+0

したがって、 'model'クラスには、' User'エンティティの属性と一致するかもしれない任意のプロパティがあります。 – Jodrell

答えて

16

これは、LINQが非常に強力な理由 - 遅延実行の最良の例の1つです。あなたは、SQL文が生成されます異なる位相でクエリを構築することができ、およびクエリが最後に実行または解決されている場合にのみ:

var query = edmxObject.Users.AsQueryable<Users>(); 

if (! String.IsNullOrEmpty(model.FirstName)) { 
    query = from user in query 
      where user.FirstName.Contains(model.FirstName) 
      select user; 
} 
if (! String.IsNullOrEmpty(model.UserName) { 
    query = from user in query 
      where user.UserName.Contains(model.UserName) 
      select user; 
} 

// this will cause the query to execute get the materialized results 
var result = query.ToList(); 
+3

これはDataContextに依存しますが、 'query'を' var'を使うのではなく 'IQueryable <>'として定義する必要があるかもしれません。いくつかのプロバイダは 'IQueryable <> 'を実装するクラスとして持っています。また、 'Users'の後に' AsQueryable() 'を置くこともできます。 – Servy

+1

if文の中で 'query = query.Where(u => u.FirstName.Contains(model.FirstName));'を使うこともできます。あなたの好みの構文に依存します。 –

+0

@Servy私はそれを更新しました。ニースキャッチ、ありがとう! – Yuck

5

クエリは、特定のフィールドが含まれていない場合、あなたは必要ありませんそれを含めて、まったくwhere句の一部として:

IQueyable<Users> user = from user in edmxObject.Users; 

if (model.FirstName != null) 
    users = users.Where(user => user.FirstName.Contains(model.FirstName) 

if (/* age is searched for */) 
    users = users.Where(user => user.Age == model.Age); 

あなたは条件付きで巣はあなたが本当に必要とするだけの条件を持っていることを確認するためにこの方法を述語することができます。

+0

助けてくれてありがとう。 – desiguy

関連する問題