Emotion Wave Tech Blog

福岡にあるエモーションウェーブ株式会社のエンジニアが書いています。

LINQで動的検索条件

VB.NETやりだして約1ヶ月です。
全体的な作りどうするの?いい感じのFrameworkとか無いのかな?状態から始まり、
まあ、そんなFWとかあるわけなく、試行錯誤し、なんとなく形が作れてきた感じがするこの頃です。
とりあえず、SQL文書きたくないってのがあったので、Entity FrameworkとLINQに挑戦しています。

で、よくある検索画面で、入力されている検索条件項目は条件とし(Where句に入れる)、
未入力の場合は条件としない(Where句に入れない)という動的条件をLINQでどう実装するのか?という話です。

(追記)開発環境は以下。

従来的な感じで、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が効くという感じです。
これベストなの?って疑問はありますが、今のところこれでお願いします。