LINQで動的検索条件
VB.NETやりだして約1ヶ月です。
全体的な作りどうするの?いい感じのFrameworkとか無いのかな?状態から始まり、
まあ、そんなFWとかあるわけなく、試行錯誤し、なんとなく形が作れてきた感じがするこの頃です。
とりあえず、SQL文書きたくないってのがあったので、Entity FrameworkとLINQに挑戦しています。
で、よくある検索画面で、入力されている検索条件項目は条件とし(Where句に入れる)、
未入力の場合は条件としない(Where句に入れない)という動的条件をLINQでどう実装するのか?という話です。
(追記)開発環境は以下。
- Visual Studio 2010 Professional
- .NET Framework 4.0
従来的な感じで、StringBuilerを使ってSQL文を組み立てる場合は、If文で実装するってのが多いと思います。
こんな感じでしょうか。
Dim sql As New Text.StringBuilder() sql.Append("SELECT * FOM hoge") sql.Append("WHERE parent_id = @parentId") If Not String.IsNullOrEmpty(condition.name) Then sql.Append("AND name LIKE @name") End If
でも今回はLINQなんで、こうは書けない。むしろこういう書き方したくない。。。
で、僕達がやっているLINQでの実装はこんな感じ。
Dim q = _ From d In Context.hoge _ Where d.PARENT_ID = condition.parentId _ And (String.IsNullOrEmpty(condition.name) Or _ d.NAME.Contains(condition.name)) _ Select d
これは普通にSQLで書くとこんな感じ。
SELECT * FROM hoge WHERE parent_id = @parentId AND (@name IS NULL OR name LIKE '%@name%')
条件となる変数のcondition.nameが空、またはhoge.NAMEにcondition.nameが含まれている場合に真。
てことで、検索条件に値が入っていない場合は条件は真となるし、入っている場合はLIKEが効くという感じです。
これベストなの?って疑問はありますが、今のところこれでお願いします。