LINQ -> Where 条件分岐
【環境】
Visual C#: 15.5.4(2017)
Visual C#: 15.5.4(2017)
経緯
EntityFramwork の実践 をする中で
Where 部の条件分岐をする必要が出た。
その際、参考サイトの手法のまま、メソッド式 LING を利用しており
条件分岐の方法が分からなくて、あれこれ探し回った。
元々
参考サイトの記述は下記の通り。
この記事用に不要部を削除して進行。
var user02 = db.Users.Where((u) => u.Name == "User02").Include("KptBoards").First();
var user02 = db.Users.Where((u) => u.Name == "User02").First();
要件
現状は User02 を取得することになっているけど
条件によって、User02, User03 を分けたい。
前提
実際の稼働確認は、他のコードで行ったので
この記事内のコードの稼働確認は行っていない。
三項演算子
三項演算子による条件分岐は
式形式では成功。
ステートメント形式では失敗。
式形式
成功。 😎
bool flg = true;
var user02 = db.Users.Where((u) => (flg) ? u.Name == "User02" : u.Name == "User03").First();
ステートメント形式
失敗。 😥
bool flg = true;
var user02 = db.Users.Where((u) => { (flg) ? u.Name == "User02" : u.Name == "User03"; }).First();
CS0834 ステートメント本体を含むラムダ式は、式ツリーに変換できません
参考サイト
プログラミング C# – 翔ソフトウェア (Sho’s):[C#][ラムダ式][式木] Expression として扱えるラムダ式と扱えないラムダ式
メソッド
条件分岐なし
まずはメソッドを利用する方法を体験するために
条件分岐なしパターン。
var user02 = db.Users.Where(IsTarget).First();
private bool IsTarget(User u)
{
return u.Name == "User02";
}
こういう書き方で、引数 u は自動でメソッドへ送られる。
条件分岐あり。そのまんま
上記のまま、条件を足してみた。
bool flg = true;
var user02 = db.Users.Where(IsTarget(flg)).First();
private bool IsTarget(User u, bool flg)
{
if (flg) return u.Name == "User03";
return u.Name == "User02";
}
CS7036 ‘Main.GetEmployeesWhereLambda(Employee, bool)’ の必要な仮パラメーター ‘boolIncludingQuitted’ に対応する特定の引数がありません。
こういう書き方はできないらしい。
ラムダ式
下記のように記述したら上手くいった。
bool flg = true;
var user02 = db.Users.Where((u) => IsTarget(u, flg)).First();
private bool IsTarget(User u, bool flg)
{
if (flg) return u.Name == "User03";
return u.Name == "User02";
}
デリゲートも含めて、理屈を理解できていないので
まだまだ挙動を掴めない。
しばらくは勉強ですね。。。