sti*_*k81 5 .net c# 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;
Run Code Online (Sandbox Code Playgroud)
如何使用formula以及filter在你的属性映射:
<property name="IsMarked" formula="(select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = ItemId and ItemWithUserFlag.UserId = :UserFilter.userId)" />
Run Code Online (Sandbox Code Playgroud)
并过滤def:
<filter-def name="UserFilter">
<filter-param name="userId" type="Int32"/>
</filter-def>
Run Code Online (Sandbox Code Playgroud)
这会产生类似的结果
SELECT Item.*, (select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = Item.ItemId and ItemWithUserFlag.UserId = ?) AS IsMarked FROM Item
Run Code Online (Sandbox Code Playgroud)
只要IsMarked被定义为bool,如果count(*)返回0它将被转换为false,如果有的话> 0,它将被转换为true.
编辑:流利的代表
public 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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
922 次 |
| 最近记录: |