2016-06-22 84 views
0

我真的用這個NHibernate查詢敲我的頭:)寫一個連接。 我與資產和產品有許多關係。請找表格模型NHibernate查詢加入多對多

public class Asset 
{ 
    string Id { get; set; } 
    List<Product> Products { get; set; } 
} 

public class Product 
{ 
    string Id { get; set; } 
    List<Asset> Assets { get; set; } 
} 

這裏下面是我與QueryOver試圖代碼

Product productAlias = null; 
Asset assetAlias = null; 
var query = Session.QueryOver<Asset>(()=>assetAlias); 

if (!string.IsNullOrEmpty(title)) 
    query.WhereRestrictionOn(x => x.Title).IsLike(title, MatchMode.Anywhere); 

if (!string.IsNullOrEmpty(productNumber)) 
{ 
    query.WhereRestrictionOn(asset => asset.Products.First().Id).Equals(productNumber); 
} 

    var result = query.List<Asset>(); 

誰能幫助如何寫加入queryover所以,我要找到所有的標題是資產像標題和productnumber等於productnumber?

我沒有得到上面的代碼的結果。

The sql query i am trying to achieve is : 

select a.* from Asset a , 
ManyToManyTable b on a.mat_id=b.mat_id 
where a.title like '%test%' and b.prod_no='212300733' 

感謝

+0

我假設你實際上正在嘗試'從Assess a * inner join * ManytoManyTable b on ...'中選擇a。*。 –

+0

不,我想要加入。資產可以有零個或多個產品。 –

+0

如果它沒有產品,它將永遠不會與產品編號相匹配。 –

回答

0

您需要使用.JoinQueryOver()改變你把什麼WHERE限制的背景下。通過http://blog.andrewawhitaker.com/blog/2014/03/16/queryover-series-part-2-basics/瞭解更多信息。這應該接近你正在尋找的東西。您聲明您正在尋找左連接,但由於此處的連接僅在指定了產品編號時適用,因此應該沒有問題。如果你覺得你需要,可以應用.Left.JoinQueryOver()。

var query = Session.QueryOver<Asset>(); 

if (!string.IsNullOrEmpty(title)) 
    query = query.WhereRestrictionOn(x => x.Title).IsLike(title, MatchMode.Anywhere); 

if (!string.IsNullOrEmpty(productNumber)) 
{ 
    query = query.JoinQueryOver(a => a.Products).Where(p => p.Id == productNumber); 
} 

var result = query.List<Asset>(); 
+0

這很棒。非常感謝! –