如何使用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()调情,这是不必要的
将过滤器更改为:
.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()}
};