QueryOver如何用于过滤特定的类?

时间:2014-02-10 12:25:17

标签: linq nhibernate nhibernate-criteria queryover

我目前正在动态构建这样的查询:

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来完成吗?

2 个答案:

答案 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”确实返回了鉴别器的值

更多细节可以在这里找到: