У меня есть список студентов в базе данных 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 для объектов, которые позволили бы мне использовать эту функцию? Можете ли вы подумать о другом способе решения этой проблемы?
Это работает. Благодаря! – cgatian