NHibernate QueryOver – 检索全部,并标记已经“选中”的那些

亲爱的NHibernate专家,

以下查询为我提供了所有类别:

var result = Session.QueryOver(() => cat).List(); 

..并通过运行此查询,我得到了所选的(category_x_product表):

 int productId = 11; Category cat = null; CategoryProduct cp = null; var subQuery = QueryOver.Of(() => cp) .Where(() => cp.ProductId == productId) .Select(Projections.Distinct(Projections.Property(() => cp.CategoryId))); result = Session.QueryOver(() => cat) .WithSubquery .WhereProperty(() => cat.Id).In(subQuery) .List(); 

任何组合这两个查询的方法,以便我得到所有带有布尔值的类别,指示在CategoryProduct-query中实际上“选择”了哪一个。

将它映射到这样的实体,也许吧?

 CategorySelected ---------------- Category Category { get; set; } bool IsSelected { get; set; 

我试图使用QueryOver找到答案,但没有成功。 这甚至可以在“或多或少”的简单查询中实现吗? 任何帮助深表感谢。 谢谢!

米卡尔

实现这一目标的一种方法是创建条件SELECT语句。 在SQL Server的情况下,我们想生成这样的东西

 SELECT CASE CategoryId IN (.... subselect ) THEN 1 ELSE 0 END ... 

但是由于NHibernate和抽象查询API,我们可以创建查询以在所有支持的DB方言中工作。

让我们尝试创建一个新解决方案的草案。 我们将首先调整SubQuery

 var subQuery = QueryOver.Of(() => cp) .Select(Projections.Distinct(Projections.Property(() => cp.CategoryId))); 

现在我们将创建条件语句

 var isSelected = Projections.Conditional( Subqueries.PropertyIn("Id", subQuery) // Category ID to be in the inner select , Projections.Constant(1) , Projections.Constant(0) ); 

我们将这个条件注入QueryOver并使用Transformers来正确填充Category的属性(包括虚拟IsSelected

 Category category = null result = Session.QueryOver(() => cat) // SELECT clause is now built .SelectList(list => list .Select(isSelected).WithAlias(() => category.IsSelected) .Select(ca => ca.Id).WithAlias(() => category.Id) ... // all properites we would like to be populated ) // Transform results into Category again .TransformUsing(Transformers.AliasToBean()) .List(); 

现在,我们新的IsSelected属性(未映射,但仅用于此SELECT (投影))填充了正确的信息。

注意:这种方法有效,但这些陈述应作为草案。 在您的情况下可能需要进行一些调整……