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가 이해할 필요가있다. 이것은 또한 다음과 같은 오류와 함께 실패
System.Data.Objects.EntityFunctions.AddSeconds(x.InsertTime, 30) < DateTime.Now
: 다음과 같이 StackOverflow에 불구하고보고 내가하는 방법이라고 EntityFunctions을 찾을 수 있었고, 내 코드를 수정
The function is not recognized by SQL Server Compact. [ Name of function = ADDSECONDS...
큰, 더 파고 후 나는 발견 그 EntityFunctions는 SQL CE 4.0 공급자가 아닌 SQL Provider에서만 작동합니다. 완전한!
내가 할 수 있었던 유일한 점은 항목 목록을 얻은 다음 그 컬렉션을 다시 필터링하는 것이 었습니다.
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