NHibernate.Linq LIKE

mxm*_*ile 22 linq nhibernate linq-to-nhibernate

如何使用NHibernate.Linq生成此查询?

WHERE this_.Name LIKE @p0; @p0 = 'test'  // Notice NO % wild card
Run Code Online (Sandbox Code Playgroud)

注意,这不是Linq To Sql或Entity Framework.这是NHibernate.

编辑:

以下是使用ICriteria的所需查询:

criteria.Add(Expression.Like("Name", "test"));
return criteria.List<Theater>();
Run Code Online (Sandbox Code Playgroud)

Kez*_*zer 24

虽然这已被标记为已解决,但当时是正确的,我可能还注意到NHibernate现在有一些扩展,所以你可以做以下事情:

Session.QueryOver<MyEntity>()
    .Where(x => x.Property.IsLike("something", MatchMode.Anywhere))
    .List();
Run Code Online (Sandbox Code Playgroud)

这将为你做一个LIKE '%something%'.

  • 问题是关于Linq到NHibernate,而不是关于Query over. (3认同)
  • 不使用 Resharper 时,必须添加一个 `using NHibernate.Criterion;`。但效果很好!谢谢。 (2认同)

tol*_*sm7 17

我相信这就是你要找的东西:

var theaters = from theater in Session.Linq<Theater>() 
               where theater.Name.Contains("test") 
               select theater;
Run Code Online (Sandbox Code Playgroud)

根据我的测试,它生成一个SQL'LIKE'语句:"... WHERE theater.Name LIKE%test%"

这正是您提供的标准片段的输出.

  • 因此,您希望生成一个LIKE语句,而不包含搜索字符串周围的%.正如你所说,你已经在使用Criteria这样做,但你想用LINQ实现同样的目标.我为误读您的初步评论而道歉......我可以问为什么有人想这样做?我相信没有通配符的LIKE运算符是相同的,或者至少被优化为与使用'='运算符相同. (2认同)

CMe*_*rat 16

我在项目中遇到了同样的问题并找到了解决方案:

session.Linq<Theater>()
    .Where(x => x.Name.StartsWith("test") && x.Name.EndsWith("test");
Run Code Online (Sandbox Code Playgroud)

这在SQL中转换为

SELECT ... WHERE Name LIKE '%test' AND Name LIKE 'test%'
Run Code Online (Sandbox Code Playgroud)

  • 我可能会忽略这一点,但肯定你并没有真正做'喜欢'而是'等于'.......其中(x => x.Name.Equals("test"); (6认同)
  • 另外:`&& x.Name.Length =="test".Length`.否则你最终会得到像'test blah blah blah blah test`这样的结果 (4认同)
  • 我知道.问题涉及没有通配符的LIKE.检查他在第一行的评论. (2认同)

Fré*_*ric 6

使用NH 4(可能稍早一点),命名空间Like内有一个内置的字符串扩展名NHibernate.Linq:Like(this string matchExpression, string sqlLikePattern).(它在NHibernate.Linq.SqlMethods扩展类上定义.)

using NHibernate.Linq;
...
session.Query<Theater>()
    .Where(t => t.Name.Like("test"));
Run Code Online (Sandbox Code Playgroud)