LINQ -> Where 条件分岐

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 20:43:44 | 最終更新:2018-01-25 (木) 22:57:02

【環境】
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";
}

デリゲートも含めて、理屈を理解できていないので
まだまだ挙動を掴めない。

しばらくは勉強ですね。。。

Posted by muchag | C# |
初回投稿:2018-01-23 (火) 20:43:44 | 最終更新:2018-01-25 (木) 22:57:02

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment