Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate,像Linq一样_Linq_Nhibernate_Linq To Nhibernate - Fatal编程技术网

NHibernate,像Linq一样

NHibernate,像Linq一样,linq,nhibernate,linq-to-nhibernate,Linq,Nhibernate,Linq To Nhibernate,如何使用NHibernate.Linq生成此查询 WHERE this_.Name LIKE @p0; @p0 = 'test' // Notice NO % wild card 注意,这不是Linq到Sql或实体框架。我是尼贝内特 编辑: 以下是使用ICriteria进行的所需查询: criteria.Add(Expression.Like("Name", "test")); return criteria.List<Theater>(); criteria.Add(Expr

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

WHERE this_.Name LIKE @p0; @p0 = 'test'  // Notice NO % wild card
注意,这不是Linq到Sql或实体框架。我是尼贝内特

编辑:

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

criteria.Add(Expression.Like("Name", "test"));
return criteria.List<Theater>();
criteria.Add(Expression.Like(“Name”,“test”));
返回条件。List();

我相信这就是您想要的:

var theaters = from theater in Session.Linq<Theater>() 
               where theater.Name.Contains("test") 
               select theater;
var theaters=from theater in Session.Linq()
where theater.Name.Contains(“测试”)
选择剧院;
根据我的测试,它会生成一个SQL“LIKE”语句: “…剧院所在位置。名称如%test%”


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

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

session.Linq<Theater>()
    .Where(x => x.Name.StartsWith("test") && x.Name.EndsWith("test");

虽然这已被标记为已解决,这在当时是正确的,但我还要注意,NHibernate现在有一些扩展,因此您可以执行以下操作:

Session.QueryOver<MyEntity>()
    .Where(x => x.Property.IsLike("something", MatchMode.Anywhere))
    .List();
Session.QueryOver()
.Where(x=>x.Property.IsLike(“某物”,MatchMode.Anywhere))
.List();
这将为您提供类似“%something%”的

对于NH4(可能更早一点),可以在
NHibernate.Linq
命名空间中使用内置的
LIKE
字符串扩展名:
LIKE(此字符串匹配表达式,字符串sqlLikePattern)
。(它是在扩展类上定义的。)

使用NHibernate.Linq;
...
session.Query()
其中(t=>t.Name.Like(“测试”);

使用条件(问题中提供),我没有看到生成%通配符。我刚刚用答案中提供的代码运行了单元测试,它生成了一个SQL语句,serch字符串两端都有%通配符。我还使用Criteria equilevant运行相同的测试,如果我使用Criteria.Add(Expression.Like(“Name”、“test”、MatchMode.Anywhere)),我会得到完全相同的SQL语句;我在SQLServer2005中使用NHibernate2.1。如果您使用相同的配置,那么应该能够看到相同的结果。问题是我不希望通配符使用Linq。我在上面的评论是对您的回答“与您提供的标准片段的输出完全一致”的回应。对不起,我不清楚。如问题所述,我可以使用iCiteria实现所需的查询,但似乎无法使用Linq实现。因此,您希望在搜索字符串周围没有%的情况下生成一个LIKE语句。正如您所说,您已经在使用标准来实现这一点,但您希望使用LINQ实现同样的目标。我很抱歉误读了你最初的评论。。。我能问一下为什么会有人想这么做吗?我相信没有通配符的LIKE运算符与使用“=”运算符相同,或者至少经过优化后与使用“=”运算符相同。是的,这是我的问题。给出了“test”这样的条件的原因,这些条件返回的值带有“test”而不是“TESTEST”。或者换句话说就是“测试”!='测试'。所以基本上它只是为了忽略案例。希望有意义。添加:
和&x.Name.Length==“test”。Length
。否则你会得到类似于
测试之类的结果,我可能没有抓住要点,但你肯定不是在做“喜欢”,而是在做“等于”。其中(x= > x.No..=(“test”);它确实是@ n3。如果搜索文本在中间,这将不起作用。例如,如果键入“CKS”,“杰克逊”这个词。不会出现。我知道。这个问题与没有通配符的LIKE有关。请查看他在第一行的评论。顺便说一句,这些都是现成的,不是定制的。+1正是我想要的,可能值得注意,以解决上面的确切问题。精确(没有%wildcard)当不使用Resharper时,必须使用NHibernate.criteria;
添加一个
。但是效果很好!谢谢。问题是关于Linq到NHibernate,而不是关于查询结束。
Session.QueryOver<MyEntity>()
    .Where(x => x.Property.IsLike("something", MatchMode.Anywhere))
    .List();