2015-11-23 38 views
0

我有一個LINQ查詢來填充我的管理儀表板的表。在它內部,我有一個case聲明根據廣告系列的日期填充字段。 (即,如果開始日期是小於DateTime.Now,那麼它將被顯示爲主動,你會看到下圖)。我想要做的是,case語句中添加一個where條件,更新EndDateDateTime.Now,使其關閉。檢查的條件是是否我Uptake已經達到我的Target,這意味着如果該活動所需的目標已經達到,那麼運動被關閉。有人可以幫幫我嗎?添加「當,那麼」條款

MSCDatabaseDataContext MSCDB = new MSCDatabaseDataContext(); 
var q = 
    from row in MSCDB.Tbl_Campaigns 
    where row.CampaignStatus != 4 
    select new Campaign 
    { 
     CampaignID = row.CampaignId, 
     CampaignName = row.CampaignName, 
     Target = Convert.ToInt32(row.Target), 
     Discount = Convert.ToInt32(row.Discount), 
     CampaignStartDatesS = 
      Convert.ToDateTime(row.StartDate).Date + " - " + 
      Convert.ToDateTime(row.EndDate).Date, 
     //CampaignSDate = Convert.ToDateTime(row.StartDate), 
     //CampaignEDate = Convert.ToDateTime(row.EndDate), 
     CurrentStatus = 
      (row.EndDate >= DateTime.Now && row.StartDate <= DateTime.Now) ? "Active" : 
      row.StartDate >= DateTime.Now ? "Pending" : 
      row.CampaignStatus == 4 ? "Archived" : "Closed", 
     Uptake = Convert.ToInt32(row.Uptake), 
    }; 
+0

,' collection.Where(a => a.CampaignStatus!= 4).Select()'。 –

+0

可以使用做多的條件'那裏 && ' – Dbuggy

+0

@YuvalItzchakov,嗨,夥計。 Uhm im仍然對開發很陌生。你能不能更具體些?另外,它表示Collection在當前上下文中不存在。是因爲我沒有把它放在正確的地方? –

回答

0

你爲什麼不只是這樣做:

MSCDatabaseDataContext MSCDB = new MSCDatabaseDataContext(); 
var q = from row in MSCDB.Tbl_Campaigns 
where row.CampaignStatus != 4 
select new Campaign 
{ 
    CampaignID = row.CampaignId, 
    CampaignName = row.CampaignName, 
    Target = Convert.ToInt32(row.Target), 
    Discount = Convert.ToInt32(row.Discount), 
    CampaignStartDatesS = Convert.ToDateTime(row.StartDate).Date + " - " + Convert.ToDateTime(row.EndDate).Date, 
    //CampaignSDate = Convert.ToDateTime(row.StartDate), 
    CampaignEDate = Convert.ToInt32(row.Uptake) == Convert.ToInt32(row.Target) ? DateTime.Now : null, 
    CurrentStatus = row.EndDate >= DateTime.Now && row.StartDate <= DateTime.Now ? "Active": row.StartDate >= DateTime.Now ? "Pending": row.CampaignStatus == 4 ? "Archived": "Closed", 
    Uptake = Convert.ToInt32(row.Uptake), 

}; 
+0

它說:「不能確定條件表達式的類型,因爲有System.DateTime的和之間的隱式轉換」。在這種情況下,null是什麼意思? @ User449689 –

+0

@KeiFrancois是CampaignEDate的DateTime或DiteTime? (可爲空)?無論如何看看我編輯的答案 – user449689

+0

不知道爲什麼,但它比賽我這個錯誤「SqlDateTime溢出。必須介於1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之間」。 @ User449689 –

0

您可以使用let預先計算值用在select:用流利的語法

var q = from row in MSCDB.Tbl_Campaigns 
     let target = Convert.ToInt32(row.Target) 
     let uptake = Convert.ToInt32(row.Uptake) 
     where row.CampaignStatus != 4 
     select new Campaign 
     { 
      CampaignID = row.CampaignId, 
      CampaignName = row.CampaignName, 
      Target = target, 
      Discount = Convert.ToInt32(row.Discount), 
      CampaignStartDatesS = Convert.ToDateTime(row.StartDate).Date + " - " + Convert.ToDateTime(row.EndDate).Date, 
      CurrentStatus = uptake >= target ? "Closed" : row.EndDate >= DateTime.Now && row.StartDate <= DateTime.Now ? "Active": row.StartDate >= DateTime.Now ? "Pending": row.CampaignStatus == 4 ? "Archived": "Closed", 
      Uptake = uptake 
     }; 
+0

嘿,你的溶劑看起來可行。事情是,我不想讓它像關閉一樣被懷疑。我想將數據庫EndDate Column物理更新爲GetDate()。所以基本上我想要row.EndDate To = DateTime.Now,IF Uptake = Target。 @DavidArno –

+2

@KeiFrancois你不能通過LINQ來做到這一點。 LINQ用於處理數據;不用於將更改寫回數據庫。 –

+0

我可以調用存儲過程在數據庫中手動更新嗎? @DavidArno –