4

我目前動態構造查詢,像這樣:如何使用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 

我該如何最好地實現這一點,最好 - 但不是必須 - 在類型sa fe way?這也可以使用LINQ來完成嗎?

回答

8

這是直觀,但FO (QueryOver):

if (bar) q = q.Where(b => b.GetType() == typeof(Derived)); 

我不確定在LINQ-to-NH中這樣做的方法。

+0

真的很好。我之前必須使用這些限制,因爲我不知道這個構造。 –

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」 :

+0

我有第一個版本,但鑑於我的鑑別器列正在使用一個整數它不工作;不過很高興知道。 –

+0

是的,安德魯的片段非常好。享受NHibernate –