Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 空测试不起作用的NHibernate JoinAlias查询_C#_Nhibernate_Nullreferenceexception_Queryover - Fatal编程技术网

C# 空测试不起作用的NHibernate JoinAlias查询

C# 空测试不起作用的NHibernate JoinAlias查询,c#,nhibernate,nullreferenceexception,queryover,C#,Nhibernate,Nullreferenceexception,Queryover,我在NHibernate的JoinAlias QueryOver那里遇到了一些意想不到的行为 我的实体基本上如下所示: public class Field { public virtual long Id { get; protected set; } public virtual Field Parent { get; protected set; } public virtual FieldType Type { get; protected set; }

我在NHibernate的JoinAlias QueryOver那里遇到了一些意想不到的行为

我的实体基本上如下所示:

public class Field
{
    public virtual long Id { get; protected set; }
    public virtual Field Parent { get; protected set; }
    public virtual FieldType Type { get; protected set; }
    public virtual string Value { get; protected set; }

...(Ctors etc
}
我的映射是这样的:

public class FieldMap : ClassMap<Field>
{
    public FieldMap()
    {
        Id(x => x.Id)
            .GeneratedBy.Native();

        References(x => x.Type)
            .Column("FieldTypeId")
            .LazyLoad()
            .Cascade.All()
            ;

        Map(x => x.Value);

        References(x => x.Parent)
            .Column("ParentFieldId")
            .Nullable()
            .LazyLoad()
            .Cascade.All()
            ;
    }
但这些都不管用

我有一个解决方法,在查询中省略对父字段值的限制,并在QueryOver返回后执行LINQ查询,如下所示:

        Field fieldAlias = null;
        string typeAlias = null;
        Field parentFieldAlias = null;

        var query = getSession().QueryOver<Field>(() => fieldAlias)
            .JoinAlias(() => fieldAlias.Type, () => typeAlias)
            .Where(() => typeAlias.Name == type)
            ;

        var list = query
        .List<Field>()
        ;

        return list
            .Where(x => (x.Parent == null) || (x.Parent.Value == parentValue))
            .ToList();
字段别名=null;
字符串typeAlias=null;
字段parentFieldAlias=null;
var query=getSession().QueryOver(()=>fieldAlias)
.JoinAlias(()=>fieldAlias.Type,()=>typeAlias)
.Where(()=>typeAlias.Name==type)
;
变量列表=查询
.List()
;
返回列表
。其中(x=>(x.Parent==null)| |(x.Parent.Value==parentValue))
.ToList();
但这并不像在QueryOver中那样理想


有什么建议吗?

第二个有限制的解决方案就可以了。有两个问题。我们需要一个到父级的左连接,我看到一个输入错误:
IsNotNull
应该是
IsNull
才能正确计算
语句:

断开的解决方案
IsNotNull
(最有可能是内部联接)

使用
IsNull
和左连接进行
工作:

.JoinAlias(() => fieldAlias.Parent, () => parentFieldAlias
           , NHibernate.SqlCommand.JoinType.LeftOuterJoin)) // left join for NULL
.Where
(
  Restrictions.Or(
    Restrictions.On(() => fieldAlias.Parent).IsNull, // this is what we need
    Restrictions.On(() => parentFieldAlias.Value).IsLike(parentValue))
);
第一种解决方案的问题是,我们无法计算浮动/虚拟对象的null值:
parentFieldAlias

.Where(()=>(parentFieldAlias.Value==parentValue)|| (parentFieldAlias==null))


我们需要检查所有者的属性:
fieldAlias.Parent

我有类似的问题,并且在条件之间有额外的括号


让事情为我工作。

很公平,这是有道理的。很好地抓住了IsNull。我会纠正它,并检查它是否如我所需工作。再次感谢您发现我的错误。很好!
            .JoinAlias(() => fieldAlias.Parent, () => parentFieldAlias)
            .Where(Restrictions.Or(Restrictions.On(() => fieldAlias.Parent).IsNotNull,
                Restrictions.On(() => parentFieldAlias.Value).IsLike(parentValue))))
        Field fieldAlias = null;
        string typeAlias = null;
        Field parentFieldAlias = null;

        var query = getSession().QueryOver<Field>(() => fieldAlias)
            .JoinAlias(() => fieldAlias.Type, () => typeAlias)
            .Where(() => typeAlias.Name == type)
            ;

        var list = query
        .List<Field>()
        ;

        return list
            .Where(x => (x.Parent == null) || (x.Parent.Value == parentValue))
            .ToList();
.JoinAlias(() => fieldAlias.Parent, () => parentFieldAlias)
.Where
(
  Restrictions.Or(
    Restrictions.On(() => fieldAlias.Parent).IsNotNull, // here
    Restrictions.On(() => parentFieldAlias.Value).IsLike(parentValue)))
)
.JoinAlias(() => fieldAlias.Parent, () => parentFieldAlias
           , NHibernate.SqlCommand.JoinType.LeftOuterJoin)) // left join for NULL
.Where
(
  Restrictions.Or(
    Restrictions.On(() => fieldAlias.Parent).IsNull, // this is what we need
    Restrictions.On(() => parentFieldAlias.Value).IsLike(parentValue))
);
.Where(() => (parentFieldAlias.Value == parentValue) || (parentFieldAlias == null));