2015-11-23 37 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 –