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 для объектов, запрашивающих записи, которые старше периода времени. Ниже представлена ​​моя первая попытка поиска записей старше 30 секунд.

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

Это не может со следующей ошибкой:

LINQ to Entities does not recognize the method 'System.DateTime AddSeconds

ИТАК, видимо, мне нужно что-то LINQ поймет. Глядя хотя StackOverflow мне удалось найти метод, называемый EntityFunctions и изменил мой код следующим образом:

System.Data.Objects.EntityFunctions.AddSeconds(x.InsertTime, 30) < DateTime.Now 

Это также не со следующей ошибкой:

The function is not recognized by SQL Server Compact. [ Name of function = 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(); 

Это действительно работает, и правильные данные теперь доступны для удаления. Однако запрос может потенциально возвращать большой набор данных, только для фильтрации до нескольких записей. ADDDATE() поддерживается Sql Compact CE 4.0. Есть ли способ, чтобы я мог написать собственное расширение Linq для объектов, которые позволили бы мне использовать эту функцию? Можете ли вы подумать о другом способе решения этой проблемы?

ответ

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(); 
+0

Это работает. Благодаря! – cgatian

Смежные вопросы