2017-03-04 164 views
0

在linq查询中选择case语句。datediff with case statement in select query linq

这里是SQL查询:

select case when DATEDIFF(day,convert(varchar,Min([Order].CreatedOnUtc),101),convert(varchar,Max([Order].CreatedOnUtc),101)) = 0 then 
Sum([Order].OrderSubtotal) 
else 
case when (DATEDIFF(day,convert(varchar,Min([Order].CreatedOnUtc),101),convert(varchar,Max([Order].CreatedOnUtc),101))/30) = 0 then Sum([Order].OrderSubtotal) else 
Sum([Order].OrderSubtotal)/ 
    (DATEDIFF(day,convert(varchar,Min([Order].CreatedOnUtc),101),convert(varchar,Max([Order].CreatedOnUtc),101))/30) 
end 
end as 'Account Value' from [order] where And Account.ID = @Act_ID 

在这里,我想代码:

var query = _orderRepository.Table; 
     query = query.Where(o => o.AccountId == accountId); 

在查询我收到我的价值。

查询语句后应该怎么写? 如何使用linq编写case语句?

+0

我希望下面的链接将有所帮助。 [linq-case-statement-stackoverflow](http://stackoverflow.com/questions/936028/linq-case-statement)[选择案例在LINQ - Stackoverflow](http://stackoverflow.com/questions/ 4244023/select-case-in-linq) – Venu

+0

我已经看到这个声明在stackoverflow ..但在我的情况下DATEDIFF与两个case语句..所以你可以指导我?? – Manoj

+0

var query = _orderRepository.Table; query = query.Where(o => o.AccountId == accountId); var MinDate =(从查询中选择d.CreatedOnUtc).Min(); var MaxDate =(从查询中的d选择d.CreatedOnUtc).Max(); var rateSum =(query.Sum(d => d.OrderSubtotal)); 查询= query.Where(C => (DbFunctions.DiffDays(为MinDate,MAXDATE)== 0) “rateSum”:???(DbFunctions.DiffDays(为MinDate,MAXDATE)/ 30 == 0) “rateSum”“ (rateSum /(DbFunctions.DiffDays(为MinDate,MAXDATE)/ 30)“); – Manoj

回答

0

@Manoj,可能是下面的代码可以帮助你。此示例C#项目可能会解决您的问题。

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace DateDiffIssue 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      // Preparing data 
      var data = new Order[] { 
       new Order { AccountID = 1, CreatedOnUtc = DateTime.Parse("1.01.2017 10:00"), OrderSubtotal = 100 }, 
       new Order { AccountID = 1, CreatedOnUtc = DateTime.Parse("1.01.2017 12:00"), OrderSubtotal = 150 }, 
       new Order { AccountID = 1, CreatedOnUtc = DateTime.Parse("1.01.2017 14:00"), OrderSubtotal = 150 } 
      }; 

      // Selection 
      var selected = (from item in data 
          let accountData = data.Where(w => w.AccountID == 1) 
          let minDate = accountData.Min(m => m.CreatedOnUtc).Date 
          let maxDate = accountData.Where(w => w.AccountID == 1).Max(m => m.CreatedOnUtc).Date 
          let isSameDate = minDate == maxDate 
          let basedOn30Days = (maxDate - minDate).TotalDays/30 
          let isInside30Days = (int)basedOn30Days == 0 
          let accountDataSum = accountData.Sum(s => s.OrderSubtotal) 
          select new 
          { 
           AccountValue = isSameDate ? accountDataSum : 
               isInside30Days ? accountDataSum : 
               accountDataSum/basedOn30Days 
          }).Distinct(); 

      // Print each order 
      selected.ToList().ForEach(Console.WriteLine); 

      // Wait for key 
      Console.WriteLine("Please press key"); 
      Console.ReadKey(); 
     } 
    } 

    internal class Order 
    { 
     public int AccountID { get; set; } 
     public DateTime CreatedOnUtc { get; set; } 
     public int OrderSubtotal { get; set; } 
    } 
} 
+0

超级..........? .. – Manoj