2016-06-22 45 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

这很棒。非常感谢! –