确定一段时间后插入的行

时间:2013-08-20 14:05:21

标签: linq-to-entities ef-code-first sql-server-ce sql-server-ce-4

我有一个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中以允许我使用该函数的实体吗?你能想到解决这个问题的另一种方法吗?

1 个答案:

答案 0 :(得分:0)

你可以试试这样的吗?这应该将时间操纵带出linq。

DateTime time = DateTime.Now.AddSeconds(-30)

var student = (from x in db.Students
              where x.Name == name &&  x.InsertTime < time
              select x).ToList();