NHibernate对嵌套字符串属性的限制

时间:2017-08-03 04:55:41

标签: c# nhibernate queryover

为简单起见,我们猜测有两个实体:

public class Entity
{
    public string Value { get; set; }

    public ChildEntity Child { get; set; }
}

public class ChildEntity
{
    public string Value { get; set; }
}

我需要找到ValueChild.Value对指定字符串query不敏感的所有实体。

这就是我现在所拥有的:

Entity entity = null;
ChildEntity child = null;

var nhibernateQuery = session
    .QueryOver(() => entity)
    .JoinAlias(() => entity.Child, () => child);

if (!string.IsNullOrWhiteSpace(query))
{
    nhibernateQuery = nhibernateQuery
        .Where(
            Restrictions.Or(
                Restrictions.On(() => entity).IsInsensitiveLike(query),
                Restrictions.On(() => child).IsInsensitiveLike(query)
            )
        );
}

return nhibernateQuery.List().ToArray();

我收到NullReferenceException - 似乎Restrictions.On无法正确处理别名。

我尝试过的另一种方法是.JoinQueryOver()this post建议:

return session
   .QueryOver<Entity>()
       .Where(Restrictions.InsensitiveLike("Value", query))
   .JoinQueryOver(e => e.Child)
       .Where(Restrictions.InsensitiveLike("Value", query));

除了一件事之外,这件事情有效:它返回Value Child.Value都像query的所有项目。我需要相同的东西,但需要or逻辑。

应该怎样做才能让它发挥作用?我想使用.QueryOver(),无论是否有别名,但没有.CreateCriteria(),但如果您帮助我使用任何有效的解决方案,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用NHibernate LINQ .Query<>()解决了这个问题 它可以自行解决所有连接和关系 同时,.Contains()方法被转换为适合我需要的MS SQL的不区分大小写的LIKE语句。

var nhibernateQuery = session
    .Query<Entity>();

if (!string.IsNullOrWhiteSpace(query))
{
    nhibernateQuery = nhibernateQuery
        .Where(e => e.Value.Contains(query) || e.Child.Value.Contains(query));
}

return nhibernateQuery.ToArray();