我有一个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 entities查询早于一段时间的条目失败。以下是我第一次尝试查找超过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无法识别该功能。 [ 的名字 function = ADDSECONDS ...
很好,经过多次挖掘后我发现EntityFunctions只能与SQL Provider一起使用,而不能与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中以允许我使用该函数的实体吗?你能想到解决这个问题的另一种方法吗?
答案 0 :(得分:0)
DateTime time = DateTime.Now.AddSeconds(-30)
var student = (from x in db.Students
where x.Name == name && x.InsertTime < time
select x).ToList();