7

統合言語クエリがあります。ユーザーが検索しているフィールドに基づいてフィルタリングする必要がある、収集したフォームからのパラメーターがたくさんあります。

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になる可能性があります。それらをクエリに含めるにはどうすればよいですか。

4

2 に答える 2

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();
于 2012-04-05T15:02:21.440 に答える
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);

この方法で条件付きで述語をネストして、本当に必要な条件だけを確保できます。

于 2012-04-05T15:04:15.340 に答える