为简单起见,我们猜测有两个实体:
public class Entity
{
public string Value { get; set; }
public ChildEntity Child { get; set; }
}
public class ChildEntity
{
public string Value { get; set; }
}
我需要找到Value
或Child.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()
,但如果您帮助我使用任何有效的解决方案,我将不胜感激。
答案 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();