QueryOver和null检查可选引用

时间:2014-08-17 20:14:15

标签: nhibernate queryover

我有一个与可选UserData有1-1关系的用户。它们在db中共享相同的标识符。

User
 Id(x => Id, "id")
 References<UserData>(x => x.UserData, "id");

UserData
 Id(x => Id, "id")

我想查询没有可选数据的所有用户。 但是此查询会对“用户ID”列进行空检查。

var list = session.QueryOver<User>()
   .Where(x => x.UserData != null)

如果我使用HasOne,情况也是如此。

1 个答案:

答案 0 :(得分:2)

假设你的映射是这样的:

    public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            Table("UserTable");
            Id(x=>x.Id).Column("Id");
            HasOne(x => x.Data);
        }
    }

    public class UserDataMap : ClassMap<UserData>
    {
        public UserDataMap()
        {
            Table("UserDataTable");
            Id(x => x.Id).Column("Id");
            Map(x=>x.DataText).Column("DataText");

        }
    }

您可以尝试:

        UserData userDataAlias = null;

        var results = session.QueryOver<User>()
            .Left.JoinQueryOver(x=>x.Data,()=>userDataAlias)
            .WhereRestrictionOn(y=>y.Id).IsNull
            .List();

带有LEFT OUTER JOINIS NULL子句的结果查询将如下所示:

SELECT
        this_.Id as Id14_1_,
        userdataal1_.Id as Id13_0_,
        userdataal1_.DataText as DataText13_0_ 
    FROM
        UserTable this_ 
    left outer join
        UserDataTable userdataal1_ 
            on this_.Id=userdataal1_.Id 
    WHERE
        userdataal1_.Id is null