nhibernate - QueryOver<T> 上的析取总是指根实体

标签 nhibernate queryover

我正在尝试使用对 X 个实现包含日期信息的特定接口(interface)的实体的析取来添加一定数量的 OR 条件。我的问题是,当生成 SQL 时,我所有的析取条件都指向我的 QueryOver 的根实体。

我创建了一个通用方法来添加我的条件

    public static QueryOver<T,T2> AddChangedCondition<T,T2>(this QueryOver<T,T2> query, DateTime from, DateTime to, Disjunction disjunction) where T2 : IHaveDate
    {
        if(disjunction == null )
            disjunction = new Disjunction();

        disjunction.Add<T2>(k => (k.DeleteDate > from && k.DeleteDate  < to)
                || k.CreatedDate > from
                || k.UpdatedDate > from);

        return query;
    }

我想像这样使用它:
Disjunction disjunction = null;
var query = QueryOver.Of<User>()
    .AddChangedCondition(fromDate,toDate, disjunction)
    .JoinQueryOver<Program>(user => user.Programs)
        .AddChangedCondition(fromDate,toDate, disjunction);

query.Where(disjunction);

由此生成的 Sql 看起来类似于
select ....
from User
where
(
    (
        this_.raderadDatum > @p1 
        and this_.raderadDatum < @p2
    ) 
    or this_.skapadDatum > @p3 
    or this_.uppdateradDatum > @p4
    )
or
    (
        this_.raderadDatum > @p1 
        and this_.raderadDatum < @p2
    ) 
    or this_.skapadDatum > @p3 
    or this_.uppdateradDatum > @p4
    )

我尝试过使用别名的不同解决方案,但没有成功。将不胜感激任何帮助!

最佳答案

以这种方式尝试,我插入了一些随机条件并使用了别名

 var qOver = _session.QueryOver<User>(() => usr)         
     .JoinAliases(() => usr.Programs, prg, JoinType.LeftOuterJoin)
     .Where(Restrictions.Or(
                Restrictions.On(() => usr.ID).IsIn(MyValue)
                ,Restrictions.Or(
                   Restrictions.On(() => prg.ID).IsIn(MyValue)
                  , Restrictions.On(() => prg.ID).IsNull)
                 )
               )
     .List<User>();

这样,您的 SQL 代码将如下所示
SELECT ....
FROM User
INNER JOIN Program On (...conditions...)
WHERE User.ID = 'MyValue'
OR (Program.ID IN ('Value1','Value2') OR Program.ID IS NULL)

我希望它有帮助

关于nhibernate - QueryOver<T> 上的析取总是指根实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5474306/

相关文章:

c# - NHibernate 和运算符重载

Nhibernate queryover order by random

database - 如何在 NHibernate 中进行此投影?

NHibernate RowCountInt64 使用转换后的查询返回错误的计数

nhibernate - QueryOver IList<string> 属性

JoinQueryOver 中的 NHibernate QueryOver Sum

nhibernate - NHibernate ISession用法和线程安全

nhibernate - 即使使用 AllDeleteOrphan,FluentNHibernate 也不会删除子实体

sql - ORM 有什么了不起?

c# - QueryOver - 向 Join 添加附加条件