normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

LINQを使った検索(Singleの意義)

ナオキさん曰く、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周りの機能ならなおさら必要だと思う。思想とコードの統合は保守フェーズとかに入ると必須じゃないかなぁ。