我有 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|Base|'
传递非类型化 DbSet 将不起作用,因为 Cast 将失败。
所以我不确定我还能尝试什么。有什么建议么?