加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – nhibernate queryover LIKE with expression trees

发布时间:2020-12-15 08:38:48 所属栏目:百科 来源:网络整理
导读:我想在我的基础存储库类中添加一个方法,允许我使用LIKE表达式,但我不太清楚如何解决这个问题.我想创建一个通用方法,查看传入的表达式树,并在传入的字符串值中查找通配符.然后,它将相应地生成QueryOver语句. 我目前有以下内容: public IListT FindAll(Expres
我想在我的基础存储库类中添加一个方法,允许我使用LIKE表达式,但我不太清楚如何解决这个问题.我想创建一个通用方法,查看传入的表达式树,并在传入的字符串值中查找通配符.然后,它将相应地生成QueryOver语句.

我目前有以下内容:

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

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

附加标准

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

>搜索*
> *搜索
> *搜索*

所以生成的查询将是:

>字段LIKE’search%’
>字段LIKE’%search’
>字段LIKE’%search%’

解决方法

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

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

.Where(Restrictions.Like(Projections.Property<T>(*projected property*),*string value*,MatchMode.Anywhere))

然而,这有点长.

所以你可以使用WhereRestrictionOn:

.WhereRestrictionOn(*projected property*).IsLike(*string value*,MatchMode.Anywhere)

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

FindAll<User>(x => x.FirstName,"bob");

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

FindAll<User>(x => x.FirstName.Contains("bob"));
FindAll<User>(x => x.FirstName.StartsWith("bob"));
FindAll<User>(x => x.FirstName.EndsWith("bob"));

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

希望有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读