ナオキさん曰く、LINQ to EntityだとSingleメソッドがサポートされないらしい。悔しい気持ちを抱いたので、ささっと日記とLINQ to Objectを使った場合のコードを書いてみた。
まず、コードは以下だ!
class FoodItemLogic { static private List<FoodItem> foodList = new List<FoodItem>(){ new FoodItem{ Id=0, Name="まんが肉", Price=1000}, new FoodItem{ Id=1, Name="ケーキ", Price=1500} }; public FoodItem search(long id) { try{ return foodList.Single( foodItem => foodItem.Id == id); }catch(InvalidOperationException e){ //普通はこの辺りにlog4netとかを使うと良いかも Console.WriteLine( "ERROR : id={0}, {1}", id, e.Message); } return null; } } class FoodItem { public long Id{get;set;} public string Name{get;set;} public long Price{get;set;} }
上の例で何が言いたいかというと、条件分岐が減るという事っす。Singleを使うと
- データが複数件ヒットした場合
- データが一件もヒットしなかった場合
の条件分岐が綺麗にまとまります(例外が起こった時だけログを吐けば良いしね)。
上の例はLINQ to Objectの例にしてるから若干伝わり難いと思うけど、こうしたコードの思想と業務ロジックの思想を統合できる様なメソッドはサポートして欲しいなぁ。
特にDB周りの機能ならなおさら必要だと思う。思想とコードの統合は保守フェーズとかに入ると必須じゃないかなぁ。