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();
}
}
私が直面している問題は、一定時間後にデータベースからエントリを DELETE したい場合、エンティティへの 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 はメソッド '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();
これは機能し、正しいデータを削除できるようになりました。ただし、クエリは潜在的に大量のデータ セットを返す可能性があり、いくつかのエントリにフィルター処理されるだけです。ADDDATE()は、 Sql Compact CE 4.0 でサポートされています。関数を利用できるようにするエンティティに、Linq への独自の拡張機能を書き込む方法はありますか? この問題を解決する別の方法を考えられますか?