今日もちょいつか

お酒の飲み過ぎか、それとも歳のせいなのか毎日ちょっぴり疲れ気味なフリーのソフト屋です。ソフト開発の話題をblogにしてみます。

C# LINQで動的なWhereを実現する

LINQを使うととても便利で驚かされます。
複雑なLINQを書いている時には、パズルみたいで不思議な楽しみもあるものです。

このLINQ
決まった条件での抽出(Where)はいいのですが、条件が動的な場合に
とたんに途方にくれてしまいます。

たとえば、売上データを検索するとして
日付で検索したり、金額で検索したりとゆうことはよくあると思います。
つまり、検索条件があったりなかったり。

SQL文でデータベースを操作しているときには
SQL文の文字列を組み立てるだけですのでとても簡単なのですが。

で、
LINQで動的にWhereを実現する方法を調べてみました。
Visual Studio Community 2017 for Mac で動作確認しています。

LINQ拡張機能

LINQの記述方法がラムダ式の場合の方法です。
ラムダ式だとメソッドチェーンでだらだらと記述をすることができます。
この時に、自分で拡張機能を作成すると独自のメソッドを書くことができます。

ものすごーくネットを検索して見つけました。

using System.Linq;
using System.Linq.Expressions;

public static IQueryable<TSource> WhereIf<TSource>
                            (this IQueryable<TSource> Source, bool Condition, Expression<Func<TSource, bool>> Predicate)
    {
            if (Condition)
                return Source.Where(Predicate);
            else
                return Source;
    }

実際に利用する時には

 var Result = DbContext.Uriage
                       .WhereIf(viewSearch.Amount != null, u => u.Amount >= viewSearch.Amount)
                       .ToArray();

つまり、検索画面からの検索条件である「金額:Amount」の入力があった時だけ
Whereを実行してくれます。
これで動的なLINQを実現することができました。

ただ、
ネットで調べてやっと実現できただけで、自分の力ではとても実現できないですね。

仕事の気分転換に、自立式ハンモック

以前からハンモックに憧れていたのですが。
屋内で使える自立式ハンモックがあるのですね。
どんなのが良いのかわからないので、1万円を切るくらいのを買ってみました。
想像していたより気持ちがいいです。
特に左右に揺らすととても気分が癒やされます。
プログラムでハマった時に気持ちを落ち着けることができそうです。