私は2つのPOCOクラスを持っています:
class Email: Base
{
public int SomeProperty { get; set; }
}
class Photo: Base
{
public int SomeOtherProperty { get; set; }
}
と基本クラス
abstract class Base
{
public DateTime DateCreated { get; set; }
}
ここに私のコンテキスト定義があります:
public class EntitiesContext : DbContext
{
public DbSet<Email> Emails { get; set; }
public DbSet<Photo> Photos { get; set; }
}
もちろん、ここにあるこれらのクラスは単なる例であり、物事はかなり複雑です。
基本クラスは、各テーブルに共通のプロパティ (変更日、状態など) を持つことのみを目的としています。私は Table-Per-Type アプローチを使用していると思います。
問題:各テーブルに対して実行する必要があるいくつかの一般的なビジネス ロジックがあります (たとえば、各タイプの未処理のアイテムをカウントするなど)。共通の基本クラスを持つ一連のテーブルを反復処理する方法が必要です。私はこのようなことをしたいと思っていました:
private void GoThroughAllTables(Action<DbSet<Base>> fnProcess, bool needSave)
{
using (var db = new EntitiesContext())
{
fnProcess(db.Emails);
fnProcess(db.Photos);
if (needSave == true)
{
db.SaveChanges();
}
}
}
public IEnumerable<QueueStatus> GetQueueStatus()
{
var res = new List<QueueStatus>();
GoThroughAllTables((set) =>
{
res.Add(new QueueStatus
{
Count = set.Cast<Base>().Count(x => x.DateCreated > someDate),
});
}, false);
return res;
}
public void DeleteFailedItems()
{
GoThroughAllTables((set) =>
{
set.Cast<Base>().Remove(x => x.DateCreated > someDate);
}, true);
return res;
}
これはコンパイルされません:
fnProcess(db.Emails);
引数 1: 'System.Data.Entity.DbSet|Email|' から変換できません 「System.Data.Entity.DbSet|ベース|」へ
Cast が失敗するため、型指定されていない DbSet を渡すことはできません。
他に何を試すことができるかわかりません。助言がありますか?