【问题标题】:LINQ query to find Date difference?LINQ查询以查找日期差异?
【发布时间】:2016-03-15 12:21:12
【问题描述】:

我有格式为 (dd/mm/yyyy) 的日期详细信息,例如,

表 #1

id  Name   date          User
--------------------------------
1   xxx  01/01/2016     user1
2   yyy  01/02/2016     user2
3   aaa  02/03/2016     user1

表#2

id Name       date
--------------------
 1  xxx    07/01/2016
 2  xxx    09/01/2016
 3  yyy    05/02/2016
 4. aaa    04/03/2016

编辑 1: 逻辑是,第一次出现在Table2中的xxx意味着,它从Table1中获取日期来计算日差。对于下一次出现 xxx 值意味着,它从 Table2(不是 table1)中获取日期,因为 Table2 已经在该表中具有值。因此,将单独使用 Table2 计算天差。其他值也一样。 编辑 2: 实际上,我需要获取该值的日期差异。如果名称是第一次出现,我必须使用 Table1 来获取日期差异。并从 Table2 中获取 Dtae 差异,如果之前出现过名称。 我将“名称”字段设置为 UNIQUE 结果应该是这样的,

 user Name       DateDifference
 ------------------------------------
 user1 xxx 6  (07/01/2016 - 01/01/2016)
 user1 xxx 2  (07/01/2016 - 09/01/2016)
 user2 yyy 4  (01/02/2016 - 05/02/2016)
 user1 aaa 2  (02/03/2016 - 04/03/2016)

我试过的LINQ查询是,

var query = (from item1 in Table1
                join item2 in Table1 on item1.Name equals item2.Name
                where item2.Date > item1.Date
                join origin in Table2 on item1.Name equals origin.Name
                where // condition
                group new { item1,item2 } by new {  item1.Name,item1.Date } into grp
                select new
                {                   

                    DayDiff = DbFunctions.DiffDays(grp.Key.Date, grp.Min(d => d.item2.Date)),
                }
                ).ToList();

但我无法得到预期的结果。我也知道这个问题,How to get the date difference by joining two tables?,但最后他们没有以正确的 LINQ 查询选项结束它。

我的问题与 How to get the date difference by joining two tables? 有何不同? 答案在 SQL 中。我需要在 LINQ 中对其进行编码。

【问题讨论】:

  • 我会参考的,谢谢
  • 我的问题与如何通过加入两个表来获取日期差异有何不同? ?答案在 SQL 中。我需要在 LINQ 中对其进行编码。
  • 不清楚:在结果表中有两行名称为 xxx,那么对:01/01/2016 - 09/01/2016,是否需要?你在哪里得到 01/01/2016 的值,你的意思是 01/01/2015 吗?更仔细地解释获得期望结果的逻辑。
  • 我无法得到预期的结果那么做什么你得到了什么?

标签: c# linq date


【解决方案1】:

我希望至少你有这两个表的导航属性。试试这个

 class Program
    {
        static void Main(string[] args)
        {
            using (var db = new aaContext2())
            {
                IList<DTO> dto = new List<DTO>();
                dto = db.Table2.Select(a => new DTO
                {
                    Name = a.Name,
                    User = a.Namea.User,
                    DateDifference = (DbFunctions.DiffDays(a.Date, db.Table2.Where(aa => aa.Name.Equals(a.Name) && a.Date < aa.Date).Min(dd => dd.Date)
                    ) ?? (DbFunctions.DiffDays(db.Table1.Where(aa => aa.Name.Equals(a.Name)).Min(aaa => aaa.Date), a.Date)))
                }).ToList();
            }
        }
    }
    public class DTO
    {
        public string User { get; set; }
        public string Name { get; set; }
        public int? DateDifference { get; set; }
    }
    public class aaContext2 : DbContext
    {
        public DbSet<Table1> Table1 { get; set; }
        public DbSet<Table2> Table2 { get; set; }

    }
    public class Table1
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual IList<Table2> NameList { get; set; }

        public DateTime Date { get; set; }
        public string User { get; set; }

    }
    public class Table2
    {
        public int Id { get; set; }
        public virtual Table1 Namea { get; set; }
        public string Name { get; set; }
        public DateTime Date { get; set; }
    }

}

【讨论】:

    【解决方案2】:

    这是一种可能的方法:

    var query =
        (from t1 in db.Table1
         join t2 in db.Table2 on t1.Name equals t2.Name
         let prevDate = (from t3 in db.Table2
                         where t3.Name == t2.Name && t3.Date < t2.Date
                         select (DateTime?)t3.Date).Max() ?? t1.Date
         select new
         {
            t1.User,
            t1.Name,
            DayDiff = DbFunctions.DiffDays(prevDate, t2.Date).Value,
         }).ToList();
    

    【讨论】:

      【解决方案3】:

      我希望日期差异在条件内而不是在查询之外,所以这个表格帮助了我:

      forums.asp.net找到它

      这是一个示例,展示了一种让所有员工在从现在到 14 天之间获得 DOB 的方法...

      var employeesWithBirthday = 
          from emp in dc.Employees
          let BirthdayDiff = (new DateTime(DateTime.Now.Year, emp.BirthDate.Month, emp.BirthDate.Day) - DateTime.Now).TotalDays 
          where BirthdayDiff >= 0 && BirthdayDiff <= 14
          select emp;
      

      ...不过,请注意,这样的查询会进行表扫描(不能使用任何索引)...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 2019-11-17
        • 1970-01-01
        相关资源
        最近更新 更多