2015-10-29 33 views
0

如何編寫Linq/lambda表達式來選擇本週的所有記錄。Linq,Lambda:獲取本週的所有記錄

1周=週日至週六(含)。

例如,如果今天是星期三,我應該得到本週的所有記錄,即從星期天到星期三。

那麼,我沒有寫完代碼,也沒有測試。我正在寫它,只是卡在「thisWeek」。

[HttpPost] 
public ActionResult Purchase(PurchaseSearchVM vm) 
{ 
    var filter = new PurchaseFilterRepository(); 
    var model = filter.FilterPurchase(vm); 
    return View(model); 
} 

public IQueryable<Purchase> FilterPurchase(PurchaseSearchVM vm) 
{ 
    var result = db.Purchases.AsQueryable(); 

    if (vm != null) 
    { 
     if (!string.IsNullOrEmpty(vm.option)) 
     { 
      if (vm.option == "today") 
      { 
       result = result.Where(p => p.Date.Date == DateTime.Now.Date); 
      } 
      else if (vm.option == "yesterday") 
      { 
       result = result.Where(p => p.Date.Date == DateTime.Now.Date.AddDays(-1)); 
      }      
      else if (vm.option == "thisWeek") 
      { 
       //help needed here 
       result = result.Where(p=> p.Date.) 
      } 
      else if (vm.option == "thisMonth") { } 
      else if (vm.option == "lastMonth") { } 
      else if (vm.option == "thisYear") { } 
      else if (vm.option == "lastYear") { } 
     } 

     if (!string.IsNullOrEmpty(vm.supplier)) 
     { 
      var value = vm.supplier; 
      //query here 
     } 

     if (vm.fromDate != null || vm.toDate != null) 
     { 
      if (vm.fromDate != null && vm.toDate == null) 
      { 
       //query here 
      } 
      else if (vm.fromDate == null && vm.toDate != null) 
      { 
       //query here 
      } 
      else if (vm.fromDate != null && vm.toDate != null) 
      { 
       //query here 
      } 
     } 

     if (vm.IsPaid != null) 
     { 
      //query here 
     } 
    } 
    return result; 
} 

UI

enter image description here

+1

顯示一些代碼。你試過了什麼? –

+1

[This answer](http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week)顯示了一個可用於擴展的方法獲取本週開始的日期。那麼你的查詢就是'.Where(p => p.Date.Date> = DateTime.Now.StartOfWeek(DayOfWeek.Sunday)&& p.Date.Date <= DateTime.Now.Date);'注意你可以使用' DateTime.Today'而不是'DateTime.Now.Date' –

回答

1

可以計算startDayOfWeekendDayOfWeek這樣的: -

DateTime startDayOfWeek= DateTime.Today.AddDays(-1 * (int)(DateTime.Today.DayOfWeek)); 
DateTime endDayOfWeek = DateTime.Today.AddDays(6 - (int)DateTime.Today.DayOfWeek); 

然後簡單地套用使用Where過濾器: -

var result = vm.Where(x => x.myDate >= startDayOfWeek && x.myDate <= endDayOfWeek); 
0

請用下面的代碼片段嘗試一下。

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Purchase> dates = new List<Purchase>(); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(-6) }); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(-5) }); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(-4) }); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(-3) }); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(-2) }); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(-1) }); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(0) }); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(1) }); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(2) }); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(7) }); 
      dates.Add(new Purchase() { FromDate = DateTime.Now.AddDays(8) }); 

      var test = dates.Where(i => i.FromDate >= DateTime.Now.StartOfWeek(DayOfWeek.Sunday) && i.FromDate <= DateTime.Now.StartOfWeek(DayOfWeek.Sunday).AddDays(7)).ToList(); 
      // you can access the this weeks dates here 
      Console.ReadLine(); 
     } 
    } 

    public class Purchase 
    { 
     public DateTime FromDate { get; set; } 
    } 
    public static class DateTimeExtensions 
    { 
     public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) 
     { 
      int diff = dt.DayOfWeek - startOfWeek; 
      if (diff < 0) 
      { 
       diff += 7; 
      } 

      return dt.AddDays(-1 * diff).Date; 
     } 
    } 
} 
0

可以按如下步驟來去除天的大寫金額,直到本週初寫:

result = result.Where(
       p=> p.Date >= p.Date.AddDays(-(p.Date.DayOfWeek - DayOfWeek.Sunday) && 
       p.Date <= DateTime.Today.Date); 

,或者使其更具全球:

var firstDayOfWeek = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; 
result = result.Where(
       p=> p.Date >= p.Date.AddDays(-(p.Date.DayOfWeek - firstDayOfWeek) && 
       p.Date <= DateTime.Today.Date);