我目前正在动态构建这样的查询:
QueryOver<Base, Base> q = QueryOver.Of<Base>();
if (foo != null) q = q.Where(b => b.Foo == foo);
// ...
现在有多个Base
(例如Derived
)的映射子类我要过滤,基本上类似于:
if (bar) q = q.Where(b => b is Derived); // does not work
或:
if (bar) q = q.Where(b => b.DiscriminatorColumn == 'derived'); // dito
我如何以类型安全的方式最好地实现这一目标,最好是 - 但不是必须的?这可以使用LINQ来完成吗?
答案 0 :(得分:8)
这不直观,但以下应该可以正常工作(QueryOver):
if (bar) q = q.Where(b => b.GetType() == typeof(Derived));
我不确定在LINQ-to-NH中如何做到这一点。
答案 1 :(得分:1)
要求QueryOver
的一般subtype
看起来像这样:
Base alias = null;
var query = session.QueryOver<Base>(() => alias);
// this statement would be converted to check of the discriminator
query.Where(o => o is Derived);
var list = query.List<Derived>();
但是这会产生一个声明,期望discirminator是“MyNamespace.Derived”。如果不是这种情况,我们可以使用这种方法:
Base alias = null;
var query = session.QueryOver<Base>(() => alias);
// here we can compare whatever value, we've used as discriminator
query.Where(Restrictions.Eq("alias.class", "Derived"));
var list = query.List<Derived>();
这里我们使用NHibernate的功能:“。class”确实返回了鉴别器的值
更多细节可以在这里找到: