2016-12-20 14 views
1

私は、すべての店舗の記録とその開店時間と閉店時間を含むデータベースを持っています。現在、データベース内の各店舗について、これらの時刻を抽出するlinqクエリがあります。以下のコードされていますLinqクエリの簡略化/カプセル化

StoresDatabaseDataContext db = new StoresDatabaseDataContext(); 
var serverData = from c in db.Stores 
        where c.storeID == currentStore.id 
        select new 
        { 
         openTime = c.SundayOpen, 
         closeTime = c.SundayOpen < c.SundayClose ? c.SundayClose : c.MondayClose, 
         timeZone = c.TimeZone, 
         hasDaylightSavings = c.DaylightSavings 
        }; 

switch (weekDay) 
{ 
    case DayOfWeek.Monday: 
     serverData= from c in db.Stores 
         where c.storeID == currentStore.id 
         select new 
         { 
          openTime = c.MondayOpen, 
          closeTime = c.MondayOpen < c.MondayClose ? c.MondayClose : c.TuesdayClose, 
          timeZone = c.TimeZone, 
          hasDaylightSavings = c.DaylightSavings 
         }; 
     break; 
    case DayOfWeek.Tuesday: 
     serverData = from c in db.Stores 
         where c.storeID == currentStore.id 
         select new 
         { 
          openTime = c.TuesdayOpen, 
          closeTime = c.TuesdayOpen < c.TuesdayClose ? c.TuesdayClose : c.WednesdayClose, 
          timeZone = c.TimeZone, 
          hasDaylightSavings = c.DaylightSavings 
         }; 
     break; 
//... 
} 

これが正しく実行されるには、しかし、重複コードがたくさんある、と私はどちらかのカプセル化または他のいくつかの方法論を介してこれを削減したいと思います。 1つの簡単なアプローチは、スイッチステートメントの複雑さを軽減することです:

serverData = from c in db.Accounts 
       where c.storeID == currentStore.id 
       select new 
       { 
        switch (weekDay) 
        { 
         case DayOfWeek.Monday: 
          openTime = c.MondayOpen; 
          closeTime = c.MondayOpen < c.MondayClose ? c.MondayClose : c.TuesdayClose; 
          break; 
         case DayOfWeek.Tuesday: 
          openTime = c.TuesdayOpen; 
          closeTime = c.TuesdayOpen < c.TuesdayClose ? c.TuesdayClose : c.WednesdayClose; 
          break; 
         //.... 
        }, 
        timeZone = c.TimeZone, 
        hasDaylightSavings = c.DaylightSavings 
       }; 

しかし、私はどのようにきれいにこのように時間を抽出するか分からない。すべてのアドバイスをいただければ幸いです。

答えて

2

私の提案は、クエリによって返されたものの作成をヘルパーファクトリクラスに委任することです。次に、クエリの結果を投影するときにクラスを呼び出します。

static class RecordFactory 
{ 
    private delegate DateTime TimeGetterFunction(Store s); 

    static object New(Store store, DayOfWeek weekDay) 
    { 
     var timeOpen = new Dictionary<DayOfWeek, TimeGetterFunction>(); 
     timeOpen.Add(DayOfWeek.Monday, (s) => s.mondayOpen); 
     timeOpen.Add(DayOfWeek.Tuesday, (s) => s.tuesdayOpen); 

     var timeClose = new Dictionary<DayOfWeek, TimeGetterFunction>(); 
     timeClose.Add(DayOfWeek.Monday, (s) => s.mondayClose); 
     timeClose.Add(DayOfWeek.Tuesday, (s) => s.tuesdayClose); 

     return new { 
      TimeOpen = timeOpen[weekDay](store), 
      TimeClose = timeClose[weekDay](store) 
      //Add more properties... 
     }; 
    } 
} 

// in your Linq query... 
select RecordFactory.New(DayOfWeek.Monday, s); 
:ファクトリクラスで

、あなたは(のDayOfWeekを応じて異なる)ゲッターへの呼び出しを簡素化するために、デリゲートを使用することができます