4

私は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 を渡すことはできません。

他に何を試すことができるかわかりません。助言がありますか?

4

0 に答える 0