C# 如何在表达式中使用接口成员
我一直在努力解决这个小问题,我很确定有一个“简单”的解决方案 我有一个具有以下方法的通用nHibernate基本存储库类:C# 如何在表达式中使用接口成员,c#,interface,lambda,expression,C#,Interface,Lambda,Expression,我一直在努力解决这个小问题,我很确定有一个“简单”的解决方案 我有一个具有以下方法的通用nHibernate基本存储库类: public IList<T> GetAll() { using (var session = SessionProvider.OpenSession()) { return session.Query<T>().ToList(); } } 在我的GetAll()方法中,我想检查当前类型是否实现了此接口,如果
public IList<T> GetAll()
{
using (var session = SessionProvider.OpenSession())
{
return session.Query<T>().ToList();
}
}
在我的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();
}
}
public IList GetAll()
{
使用(var session=SessionProvider.OpenSession())
{
如果(T的类型被删除)
{
//仅检索未标记为已删除的实体
//我在这里干什么?
}
返回session.Query().ToList();
}
}
我知道我可以检索所有实体并循环这些实体-但我更喜欢更干净的方法-例如,实现检查的表达式(如果可能)
如果有人能帮我解决这个问题,我将不胜感激:)首先
typeof(T) is ISetDeleted
仅当类型参数被删除时才会返回true,而当实现接口时则不会返回true。你可能想要
if (typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
第二,我想你想要
return session.Query<T>().Where(x => !((ISetDeleted)x).IsDeleted).ToList();
return session.Query().Where(x=>!((ISetDeleted)x).IsDeleted.ToList();
首先
仅当类型参数被删除时才会返回true,而当实现接口时则不会返回true。你可能想要
if (typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
第二,我想你想要
return session.Query<T>().Where(x => !((ISetDeleted)x).IsDeleted).ToList();
return session.Query().Where(x=>!((ISetDeleted)x).IsDeleted.ToList();
您可以使用Linq(namespace System.Linq):
public IList GetAll()
{
使用(var session=SessionProvider.OpenSession())
{
if(typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
{
return session.Query().Where(o=>!(ISetDeleted)o).Deleted.ToList();
}
其他的
{
返回session.Query().ToList();
}
}
}
您可以使用Linq(namespace System.Linq):
public IList GetAll()
{
使用(var session=SessionProvider.OpenSession())
{
if(typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
{
return session.Query().Where(o=>!(ISetDeleted)o).Deleted.ToList();
}
其他的
{
返回session.Query().ToList();
}
}
}
如果您可以这样编写,将来将更容易扩展,还允许您添加其他约束:
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();
}
}
public IList GetAll()
{
使用(var session=SessionProvider.OpenSession())
{
var query=session.query();
if(typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
{
query=query.Where(x=>!(ISetDeleted)x).已删除);
}
返回query.ToList();
}
}
如果该会话可用,则该选项应可用。查询将返回IQueryable,如果您可以这样编写它,它将更容易在将来进行扩展,并允许您添加其他约束:
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();
}
}
public IList GetAll()
{
使用(var session=SessionProvider.OpenSession())
{
var query=session.query();
if(typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
{
query=query.Where(x=>!(ISetDeleted)x).已删除);
}
返回query.ToList();
}
}
如果该会话有效,该功能应该可以正常工作。查询返回一个IQueryable我当时差点就搞定了(整个演员阵容中缺少括号):)非常感谢-你们太棒了!:)当时我差点就搞定了(整个演员阵容中缺少括号):)非常感谢你们——你们真是棒极了!:)