【问题标题】:datediff with case statement in select query linqdatediff 在选择查询 linq 中带有 case 语句
【发布时间】:2017-03-04 11:12:25
【问题描述】:

在 linq 查询中选择 case 语句。

这里是关于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 语句???

【问题讨论】:

  • 我已经在 stackoverflow 中查看了这个语句..但在我的情况下 DATEDIFF 有两个 case 语句..所以你能指导我吗??
  • var query = _orderRepository.Table; query = query.Where(o => o.AccountId == accountId); var MinDate = (from d in query select d.CreatedOnUtc).Min(); var MaxDate = (from d in query select d.CreatedOnUtc).Max(); var rateSum = (query.Sum(d => d.OrderSubtotal)); query = query.Where(c => (DbFunctions.DiffDays(MinDate, MaxDate) == 0) ? "rateSum" : (DbFunctions.DiffDays(MinDate, MaxDate) / 30 == 0) ? "rateSum" ? "(rateSum / (DbFunctions.DiffDays(MinDate, MaxDate) / 30)");
  • 先生,我正在尝试这个,但出现错误你能帮我解决吗
  • 你的问题解决了吗?

标签: sql sql-server linq


【解决方案1】:

@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; }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2013-03-25
    • 2021-07-17
    相关资源
    最近更新 更多