0

我有一个 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 扩展写入允许我使用该功能的实体?你能想出另一种方法来解决这个问题吗?

4

1 回答 1

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();
于 2013-08-20T14:18:10.490 回答