ibernate的Queryover子查询和whereexist

ibernate的Queryover子查询和whereexist

本文介绍了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条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-21 00:06