NHibernate QueryOver - 检索所有内容,并标记已“选择”的内容
本文关键字:选择 QueryOver 检索 NHibernate | 更新日期: 2023-09-27 18:31:19
亲爱的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,我们可以创建在所有受支持的数据库方言中工作的查询。
让我们尝试创建新解决方案的草稿。我们将首先调整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
正确填充类别的属性(包括虚拟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<Category>())
.List<Category>();
现在,我们的新IsSelected
属性(未映射,但仅用于此 SELECT(投影))填充了正确的信息。
注意:这种方法是有效的,但声明应被视为草稿。在您的情况下可能需要进行一些调整...