我有一个 SQL CE 4.0 数据库中的学生列表。每个人都有一个与学生相关的插入时间。这是上下文设置。
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public DateTime InsertTime { get; set; }
}
public class StudentContext : DbContext
{
public StudentContext()
: base("StudentContext")
{ }
public DbSet<Student> Students { get; set; }
}
插入一个新学生效果很好,如下所示:
static void AddStudent(string name)
{
using (var db = new StudentContext())
{
var s = new Student()
{
Name = name,
InsertTime = DateTime.Now
};
db.Students.Add(s);
db.SaveChanges();
}
}
我遇到的问题是,当我想在给定时间后从数据库中删除条目时,使用 linq to entity 查询早于一段时间的条目失败。下面是我第一次尝试查找超过 30 秒的条目。
var student = (from x in db.Students
where x.Name == name
&& x.InsertTime.AddSeconds(30) < DateTime.Now
select x).ToList();
这失败并出现以下错误:
LINQ to Entities 无法识别方法“System.DateTime AddSeconds
好吧,显然我需要一些 linq 会理解的东西。通过 StackOverflow,我找到了一个名为 EntityFunctions 的方法,并修改了我的代码,如下所示:
System.Data.Objects.EntityFunctions.AddSeconds(x.InsertTime, 30) < DateTime.Now
这也失败并出现以下错误:
SQL Server Compact 无法识别该函数。[ 函数名称 = ADDSECONDS ...
太好了,经过更多挖掘后,我发现 EntityFunctions 仅适用于 SQL 提供程序,而不适用于 SQL CE 4.0 提供程序。完美的!
我唯一能想到的就是获取条目列表,然后再次过滤该集合。
var student = (from x in db.Students
where x.Name == name
select x).ToList();
var filteredStudent = student.Where(s => s.InsertTime.AddSeconds(30) < DateTime.Now).ToList();
这确实有效,并且现在可以删除正确的数据。但是,查询可能会返回大量数据,只是被过滤到几个条目。Sql Compact CE 4.0 支持ADDDATE () 。有什么方法可以将我自己的 Linq 扩展写入允许我使用该功能的实体?你能想出另一种方法来解决这个问题吗?