我一直在努力解决这个小问题 - 而且我很确定这是一个“简单”的解决方案。
我有一个通用的nHibernate base-repository类,它有以下方法:
public IList<T> GetAll()
{
using (var session = SessionProvider.OpenSession())
{
return session.Query<T>().ToList();
}
}
但是 - 我试图通过使用一些非常简单的接口来控制我的模型。我有一个接口 - ISetDeleted:
public interface ISetDeleted
{
bool Deleted { get; set; }
}
在我的GetAll()方法中,我想检查当前类型是否实现了这个接口 - 如果是,只返回未标记为已删除的实体:
public IList<T> GetAll()
{
using (var session = SessionProvider.OpenSession())
{
if (typeof(T) is ISetDeleted)
{
// Only retrieve entities that are not marked as deleted
// WHAT DO I DO HERE?
}
return session.Query<T>().ToList();
}
}
我知道我可以检索所有实体并循环遍历这些 - 但我更喜欢更清洁的方法 - 例如实现检查的表达式(如果可能)。
如果有人可以帮我解决这个问题,我将非常感激:)
答案 0 :(得分:3)
第一
typeof(T) is ISetDeleted
仅在类型参数 ISetDeleted时返回true,而不是实现接口。你可能想要
if (typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
其次,我认为你想要
return session.Query<T>().Where(x => !((ISetDeleted)x).IsDeleted).ToList();
答案 1 :(得分:0)
您可以使用Linq(名称空间System.Linq):
public IList<T> GetAll()
{
using (var session = SessionProvider.OpenSession())
{
if (typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
{
return session.Query<T>().Where(o => !(ISetDeleted) o).Deleted).ToList();
}
else
{
return session.Query<T>().ToList();
}
}
}
答案 2 :(得分:0)
如果您可以像这样编写它,将来会更容易扩展,并允许您添加其他约束:
public IList<T> GetAll()
{
using (var session = SessionProvider.OpenSession())
{
var query = session.Query<T>();
if (typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
{
query = query.Where(x => !(ISetDeleted)x).Deleted);
}
return query.ToList();
}
}
如果session.Query返回IQueryable ,应该可以工作