在NHibernate查询中根据不同的表设置值

时间:2011-01-20 12:00:51

标签: c# .net nhibernate fluent-nhibernate

我正在使用NHibernate,并且遇到此查询的问题...我有一个类项目,我想使用其Id获取。一切都很好。但是,如果设置了其他条件,我还希望将Item类中的bool属性设置为true。具体来说,此属性名为IsMarked,告知是否为请求它的用户标记/标记/标记了该项,并且此信息在表上设置,给出了Item和User之间的关系。

目前我正在获取Item,然后查找引用 - 如果可以找到引用,则将属性更新为true。我可以在一个查询中执行此操作吗?

var item = Session.Get<Item>(itemId);

var flaggedResult = Session.CreateCriteria<ItemWithUserFlag>()
    .Add(Restrictions.Eq("User.Id", userId))
    .Add(Restrictions.Eq("Item", item))
    .List<ItemWithUserFlag>();

if (flaggedResult.Count > 0)
    item.IsMarked = true; 

return item; 

1 个答案:

答案 0 :(得分:7)

如何在属性映射中使用formulafilter

<property name="IsMarked" formula="(select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = ItemId and ItemWithUserFlag.UserId = :UserFilter.userId)" />

过滤def:

<filter-def name="UserFilter">
    <filter-param name="userId" type="Int32"/>
</filter-def>

这会产生类似

的结果
SELECT Item.*, (select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = Item.ItemId and ItemWithUserFlag.UserId = ?) AS IsMarked FROM Item

只要IsMarked定义为bool,如果count(*)返回0,则会转换为false,如果有> 0,则会转换为truepublic class ItemMap : ClassMap<Item> { public ItemMap() { /// ... whatever Map(x => x.IsMarked).Formula("(select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = ItemId and ItemWithUserFlag.UserId = :UserFilter.userId)"); } } public class UserFilter : FilterDefinition { public UserFilter() { WithName("UserFilter") .AddParameter("userId", NHibernate.NHibernateUtil.Int32); } }

编辑:流利的代表

{{1}}