2017-06-26 13 views
0

曜日に応じてSQLの列(曜日で指定)から情報を返すコードを実行しようとしていますが、私は現在、このような冗長なコードを持っています。曜日に基づいてクエリを実行する

public void ErrorTest() 
{ 
    using (ScraperSetupEntities context = new ScraperSetupEntities()) 
    { 
     int collectionavg; 
     string today = DateTime.Now.DayOfWeek.ToString(); 
     if (today == "Sunday") 
     { 
      collectionavg = context.FourWeekCollectionReports.First().FourWeekSundayCollected; 
     } 
     if (today == "Monday") 
     { 
      collectionavg = context.FourWeekCollectionReports.First().FourWeekMondayCollected; 
     } 
     // etc etc for every day of the week 
    } 
} 

は、私は文字列リテラルを持っており、「収集」「FourWeek」+今日+に曜日を追加し、クエリとして文字列を実行することができ、T-SQLで知っているが、私はできませんどのようにC#で似たようなことをするかを理解する。どんな助けもありがとう。おかげ

+2

を求めることができますか? – Minh

+0

'First()'オブジェクトに 'collectionAvg'を返すメソッドがありますか?たとえば、 'int GetFourWeekCollectedByDay(string dayName)'?インターフェースや継承を使用していても、 'if-else-if'や' switch'/'case'の束を回避する方法はありません。 – Kyle

+0

このデザインではありません。しかし、あなたはswitch文を使用するべきです。そして、それと比較するために列挙型でToStringを呼び出すべきではありません。 DayOfWeek列挙体を使用して、DateTime.DayOfWeekと比較します。 – Will

答えて

1

は機能...

あなたはWeekCollectionから適切な日を選択するためにLINQのどこから()関数を使用することができますしてください。

次に、LinqのSelect()関数を使用して、平均収集数を返すことができます。

public int GetCollectionAvgFromDay(ScraperSetupEntities context, string DayOfWeek) 
{ 
    return context.FourWeekCollectionReports.First().Where(x => x.Day == DayOfWeek).Select(x => x.CollectionAvg); 
} 

WeekCollectionReportが含まれている必要があります何のスケルトン:

public class WeekCollectionReport 
{ 
    public string Day {get; set;} 
    public int CollectionAvg {get; set;} 
} 

をし、それを呼び出すために、ちょうどん:あなたは変更する場合を除き、あなたは本当にこれをやって逃げることができない

public void ErrorTest() 
{ 
    using (ScraperSetupEntities context = new ScraperSetupEntities()) 
    { 
     int collectionavg; 
     string today = DateTime.Now.DayOfWeek.ToString(); 
     collectionavg = GetCollectionAvgFromDay(context, today); 
    } 
} 
0

デザイン。コードのサイズを小さくする/クリーナーにしたくない場合は、モデルにコードをモード設定できます。

あなたはSWITCH文を使用していないのはなぜ

public class Report 
{ 
    public int SundayAvg { get; set; } 
    public int MondayAvg { get; set; } 
    public int TuesdayAvg { get; set; } 

    //new property that just returns Todays average. 
    public int TodayAverage => GetTodayAverage(); 


    public int GetTodayAverage() 
    { 
     switch (DateTime.Today.DayOfWeek) 
     { 
      case DayOfWeek.Sunday: 
       return SundayAvg; 
      case DayOfWeek.Monday: 
       return MondayAvg; 
      case DayOfWeek.Tuesday: 
       return TuesdayAvg; 
      ... 
      default: 
       //How the hell did that happen; 
       return 0; 

     } 
    } 
} 

...次に、あなただけのTodayAverage

List<Report> report = new List<Report>(); 
report.Add(new Report() { SundayAvg = 1, MondayAvg = 2, TuesdayAvg = 3 }); 

var a = report.First().TodayAverage; 
関連する問題