本文介绍了NHibernate的Queryover子查询和whereexists与2条件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
考虑下面的对象结构。
产品
ID:INT
名称:字符串
属性:属性列表
属性
ID:INT
名称:字符串
值:字符串
PRODUCT_ID:INT
的问题是:使用QueryOver如何形成一个子查询返回所有产品具备以下条件:
选择在哪里时,有在同一时间属性的所有产品:
属性名=颜色值=红和属性名=大小值=XXL?
编辑:的SQL示例:
SELECT * FROM产品p其中
存在(选择属性ID,其中name ='颜色'和值='红色'和的product_id = p.id)
和
存在(选择属性ID,其中name ='大小'和值='XXL'和的product_id = p.id)
解决方案
使用子查询计数属性相匹配的是最简单的IMO
产品productAlias = NULL
//获得匹配的属性计数
VAR子查询= QueryOver.Of<产品>()
。凡(P => p.Id == productAlias.Id)
.JoinQueryOver(P => p.Attributes)
。凡(A =>(a.Name ==颜色和安培;&安培; a.value中==红)||(a.Name ==大小和放大器;&安培; a.value中== XXL))
。选择(Projections.RowCount());
//获取产品,所有比赛
VAR的结果= session.QueryOver(()=> productAlias)
.WithSubquery.WhereValue(2).EQ(子查询)
的.List();
,如果有一个属性产品上的属性类
的子查询可以缩短Consider the following object structure.
Product
id : int
name : string
attribute : list of Attribute
Attribute
id : int
name: string
value : string
product_id : int
The questions is:Using QueryOver how to form a subquery to return all productswith the following conditions:
Select all products where when have attributes at the same time:
Attribute name = "Color" Value="Red"andAttribute name = "Size" Value="XXL" ?
Edit: Sample sql:
select * from Product p where
exists (select id from attribute where name = 'Color' and value = 'Red' and product_id = p.id)
and
exists (select id from attribute where name = 'Size' and value = 'XXL' and product_id = p.id)
解决方案
using a subquery which counts the attribute matches is the easiest IMO
Product productAlias = null
// get the count of matching Attributes
var subquery = QueryOver.Of<Product>()
.Where(p = > p.Id == productAlias.Id)
.JoinQueryOver(p => p.Attributes)
.Where(a => (a.Name == "Color" && a.Value == "Red") || (a.Name == "Size" && a.Value == "XXL"))
.Select(Projections.RowCount());
// get the Products where all match
var results = session.QueryOver(() => productAlias)
.WithSubquery.WhereValue(2).Eq(subquery)
.List();
The subquery can be shortened if there is a Property Product on the Attribute class
这篇关于NHibernate的Queryover子查询和whereexists与2条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!