NHibernate Like 对嵌套字符串属性的限制
NHibernate Like restriction on nested string properties
为简单起见,我们假设有两个实体:
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));
除了一件事,这个东西有用:它 returns 所有 Value
和 Child.Value
都像 [=15= 的项目].我需要同样的东西,但具有 or
逻辑。
应该怎么做才能让它发挥作用?我想使用 .QueryOver()
,有或没有别名,但没有 .CreateCriteria()
,但如果你能帮助我解决任何问题,我将不胜感激。
问题已通过使用 NHibernate LINQ 解决.Query<>()
。
它可以自行解决所有连接和关系。
同时,.Contains()
方法被翻译为不区分大小写的 LIKE
语句,用于 MS SQL 适合我的需要。
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();
为简单起见,我们假设有两个实体:
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));
除了一件事,这个东西有用:它 returns 所有 Value
和 Child.Value
都像 [=15= 的项目].我需要同样的东西,但具有 or
逻辑。
应该怎么做才能让它发挥作用?我想使用 .QueryOver()
,有或没有别名,但没有 .CreateCriteria()
,但如果你能帮助我解决任何问题,我将不胜感激。
问题已通过使用 NHibernate LINQ 解决.Query<>()
。
它可以自行解决所有连接和关系。
同时,.Contains()
方法被翻译为不区分大小写的 LIKE
语句,用于 MS SQL 适合我的需要。
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();