nhibernate queryover LIKE with expression trees

Col*_*e W 7 c# nhibernate queryover

我想在我的基础存储库类中添加一个方法,允许我使用LIKE表达式,但我不太清楚如何解决这个问题.我想创建一个通用方法,查看传入的表达式树,并在传入的字符串值中查找通配符.然后,它将相应地生成QueryOver语句.

我目前有以下内容:

public IList<T> FindAll(Expression<Func<T, bool>> criteria, char wildCard)
{
    return SessionFactory.GetCurrentSession()
            .QueryOver<T>()
            .Where(criteria)
            .List();
}
Run Code Online (Sandbox Code Playgroud)

显然,困难的部分尚未到来.我需要查看表达式树并QueryOver动态构建查询.寻找关于如何继续这一点的一些指示.或者我只是在这里浪费时间,应该在我的存储库中创建处理LIKE查询的单个方法?

附加标准

理想情况下,我想区分以下内容:

  • 搜索*
  • *搜索
  • *搜索*

所以生成的查询将是:

  • 字段LIKE'search%'
  • 字段LIKE'%search'
  • 字段LIKE'%search%'

Phi*_*ill 14

在QueryOver中编写Like表达式有两种方法.

如果你从Where子句中删除它:

.Where(Restrictions.Like(Projections.Property<T>(*projected property*), *string value*, MatchMode.Anywhere))
Run Code Online (Sandbox Code Playgroud)

然而,这有点长.

所以你可以使用WhereRestrictionOn:

.WhereRestrictionOn(*projected property*).IsLike(*string value*, MatchMode.Anywhere)
Run Code Online (Sandbox Code Playgroud)

这意味着你需要传递两个参数,如:

FindAll<User>(x => x.FirstName, "bob");
Run Code Online (Sandbox Code Playgroud)

你可以使用.Contains,.StartsWith,.EndsWith,但我不确定.

FindAll<User>(x => x.FirstName.Contains("bob"));
FindAll<User>(x => x.FirstName.StartsWith("bob"));
FindAll<User>(x => x.FirstName.EndsWith("bob"));
Run Code Online (Sandbox Code Playgroud)

我不认为那些在NHibernate中工作.

希望有所帮助.


Mar*_*ani 0

我真的不明白你想做什么。您想要查询,例如

session.QueryOver<T>().Where(x => x.property == "*substring*").List();
Run Code Online (Sandbox Code Playgroud)

生成类似“%substring%”的属性查询?在大多数 Linq 提供程序中,String.Contains 方法在“LIKE”查询中进行转换,因此您不需要在表达式树中查找通配符,只需在 String.Contains 方法中查找。
对于后者,您必须解析表达式树以查找 String.Contains() 方法。这可能会很麻烦(http://msdn.microsoft.com/en-us/library/bb397951.aspx)。另外,我在您的方法中看不到哪个属性要与 LIKE 运算符“比较”。

无论如何,我认为将 ICriterion 传递给您的 .Where() 会更容易,例如

.Where(new NHibernate.Criterion.LikeExpression("property", "%value%"))
Run Code Online (Sandbox Code Playgroud)

,并在其后附加您的其他条件 .And() 。缺点是丢失强类型查询。