如何使用LINQ比较日期和日期时间

本文关键字:日期 时间 比较 何使用 LINQ | 更新日期: 2023-09-27 18:22:02

我正在尝试用两个列表为数据库种子。第一个列表只是一堆项目。第二个列表是引用第一个列表的一堆垃圾。我正试图通过LINQ引用第二个垃圾列表中第一个列表中的项目,但我很确定我做得不对:

例如,列表1:

var items = new List<Item>()
{
    new Item { ItemtId = 1, DateTime = new DateTime(2014, 09, 05, 12, 30, 30), Text = "Cheese" },
    new Item { ItemtId = 1, DateTime = new DateTime(2014, 09, 05, 12, 30, 30), Text = "Lettuce" },
    new Item { ItemtId = 1, DateTime = new DateTime(2014, 09, 05, 12, 30, 30), Text = "Ground Beef" },
    new Item { ItemtId = 1, DateTime = new DateTime(2014, 09, 03, 12, 30, 30), Text = "Ketchup" },
    new Item { ItemtId = 1, DateTime = new DateTime(2014, 09, 03, 12, 30, 30), Text = "Mustard" },
};
var junk= new List<Junk>()
{
    new Junk { JunkId = 1, DateTime = new DateTime(2014, 09, 05, 10, 00, 00), Items = items.Where(d => d.DateTime.ToShortDateString() == new DateTime(2014, 09, 05).ToShortDateString()},
    new Junk { JunkId = 2, DateTime = new DateTime(2014, 09, 03, 11, 00, 00), Items = items.Where(d => d.DateTime.ToShortDateString() == new DateTime(2014, 09, 03).ToShortDateString()}
};

这似乎应该是我的答案,因为我只对日期感兴趣,而对时间不感兴趣,但它并不是这样的种子。我得到错误:

LINQ to Entities无法识别方法"System.String"ToShortDateString()方法,而此方法无法转换为存储表达式。

对如何构建更好的解决方案有什么想法吗?

更新

看起来我没有把我的代码准确地转录到网站上,最终发现了我的问题。

在我最初的代码中,我有:

new Junk { JunkId = 1, DateTime = new DateTime(2014, 09, 05, 10, 00, 00), Items = context.Items.Where(d => d.DateTime.Date == new DateTime(2014, 09, 05) }

当我应该有

new Junk { JunkId = 1, DateTime = new DateTime(2014, 09, 05, 10, 00, 00), Items = items.Where(d => d.DateTime.Date == new DateTime(2014, 09, 05) }

我一直在和.ToShortDateString()调情,这是不必要的

如何使用LINQ比较日期和日期时间

将过滤器更改为:

.Where(d => d.DateTime.Date == new DateTime(2014, 09, 05))

您可以使用EntityFunctions类的TruncateTime函数。

new Junk { JunkId = 1, DateTime = new DateTime(2014, 09, 05, 10, 00, 00), Items = items.Where(d => EntityFunctions.TruncateTime(d.DateTime) == EntityFunctions.TruncateTime(new DateTime(2014, 09, 05))}

注意:如果使用EntityFramework 6,则它应该是EntityFramework.dll中的System.Data.Entity.DbFunctions.TruncateTime(…)方法。

您的子查询(Junk变量的Items=部分)不是一个列表,而是一个可枚举的,所以它在枚举之前不会被具体化,直到您在linq-to-entities查询中使用它时才会被枚举。

如果您将其更改为:

var junk= new List<Junk>()
{
    new Junk { JunkId = 1, DateTime = new DateTime(2014, 09, 05, 10, 00, 00), Items = items.Where(d => d.DateTime.ToShortDateString() == new DateTime(2014, 09, 05).ToShortDateString()).ToList()},   // this one will work as it gets materialized right now, not later, so by the time you pass it to linq to entities later it will already be a simple list of diferences, it won't try to compute "toshortdatestring" later, that will already be done
    new Junk { JunkId = 2, DateTime = new DateTime(2014, 09, 03, 11, 00, 00), Items = items.Where(d => d.DateTime.ToShortDateString() == new DateTime(2014, 09, 03).ToShortDateString()}
};