cat).List(); .. 并通过运行此查询,我选择了-6ren">
gpt4 book ai didi

c# - NHibernate QueryOver - 检索所有,并标记那些已经是 "selected"

转载 作者:行者123 更新时间:2023-11-30 12:10:18 25 4
gpt4 key购买 nike

尊敬的 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();

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

可以将它映射到这样的实体吗?

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)
);

我们将该条件注入(inject) 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 (投影))已填充了正确的信息。

注意:此方法有效,但应将声明视为草稿。您的情况可能需要进行一些调整...

关于c# - NHibernate QueryOver - 检索所有,并标记那些已经是 "selected",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18812892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com