查询结束开始与

查询结束开始与

问题描述:

我必须尝试查找基于搜索的结果,这应该是首发,但我找不到QueryOver其中有startwith,有没有其他方法?查询结束开始与

public IEnumerable<Company> Find(string keyword) 
{ 
    var sesion = SessionController.CurrentSession; 
    return sesion.QueryOver<Company>() 
    .Where(
     Restrictions.On<Company>(x => x.CompanyName).IsLike("%" + keyword + "%") || 
     Restrictions.On<Company>(x => x.Id).IsLike("%" + keyword + "%") 
    ) 
    .List<Company>(); 
} 
+1

你的意思是除了删除IsLike限制中的前导%吗? – jbl

的方式,通过QueryOver基础设施的支持将是使用明确MatchMode

sesion 
    .QueryOver<Company>() 
    .Where 
    (
    Restrictions.On<Company>(x => x.CompanyName).IsLike(keyword, MatchMode.Start) || 
    Restrictions.On<Company>(x => x.Id  ).IsLike(keyword, MatchMode.Start) 
) 
    .List<Company>(); 

但有极少数代码(在Restrictions.On风格的自定义扩展)我们甚至可以做到这一点语法:

... 
.Where 
(
    Restrict.On<Contact>(x => x.CompanyName).StartsWith(keyword) || 
    Restrict.On<Contact>(x => x.Id  ).StartsWith(keyword) 
) 

而且Restrict的定义:

public static class Restrict 
{ 
    public static StringRestrictionBuilder<T> On<T>(Expression<Func<T, object>> expr) 
    { 
     return new StringRestrictionBuilder<T>(expr); 
    } 
    public class StringRestrictionBuilder<T> 
    { 
     readonly Expression<Func<T, object>> _expression; 
     public StringRestrictionBuilder(Expression<Func<T, object>> expression) 
     { 
      _expression = expression; 
     } 
     public AbstractCriterion StartsWith(string value) 
     { 
      return Restrictions.On(_expression).IsLike(value, MatchMode.Start); 
     } 
     public AbstractCriterion Contains(string value) 
     { 
      return Restrictions.On(_expression).IsLike(value, MatchMode.Anywhere); 
     } 
     public AbstractCriterion EndsWith(string value) 
     { 
      return Restrictions.On(_expression).IsLike(value, MatchMode.End); 
     } 
    } 
}