多くの AND/OR コンポーネントを含む複雑なステートメントは読みにくく、エラーが発生しやすくなります。通常の IF ステートメントでは、メソッド呼び出しを使用して is ステートメントを簡素化することがあります。たとえば、次のようになります。
if (((user == myUser || user == yourUser) && user != Admin)
&& Something > SomethingElse
&& (thresholdDate > item.itemDate || (item.itemDate == null && item.itemType == itemIsDated))
)
{
DoStuff();
}
ユーザー部分と日付部分をリファクタリングして、読みやすくすることができます。
if (
UserValid(user)
&& Something > SomethingElse
&& DateIsValid(thresholdDate, item)
)
{
DoStuff();
}
ネストされた IF を単純化するために、LINQ クエリで何ができますか?
たとえば、次のようなものがあるとします。
var someResults = DataManager.Things
.Where(item => (item.UserName == currentUser.UserName
|| item.ParentUsername == currentUser.UserName)
&& (item.ItemType == (int) ItemType.MyType
|| item.ItemType == (int) ItemType.YourType)
&& item.Result == null
&& (
(item.Status == null
&& (item.ItemDate < thresholdDate
|| item.ItemType == (int) ItemType.YourType)
)
||
(item.Status != null &&
item.Status != "Rejected")
)
)
** 実際のコードではありません - 単純化された一般的な例です。
ロジックの一部をメソッドに抽出したり、他の方法で AND / OR の混乱を分離したりして、何が起こっているのかを明確にしたいと考えています。
「アイテム」にメソッドを追加して、ある種の IsValidType(typeOptions) メソッドのロジックを実行しようとしました - これは正常にコンパイルされますが、LINQ は実行時にメソッドを認識しないと不平を言います。
アイテムでプロパティを使用できますが、コンテキスト情報を渡すことができません (使用が制限されます)。
この種のクエリを読みやすくするにはどうすればよいでしょうか。