2010-04-08 58 views
13

我有一个实体,它的映射:NHibernate LINQ支持Where()子句中的ToLower()吗?

public class Test 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
} 

public class TestMap : EntityMap<Test> 
{ 
    public TestMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.Description); 
    } 
} 

我试图在其上运行一个查询(抓住它从数据库中):

var keyword = "test" // this is coming in from the user 
keyword = keyword.ToLower(); // convert it to all lower-case 

var results = session.Linq<Test> 
    .Where(x => x.Name.ToLower().Contains(keyword)); 

results.Count(); // execute the query 

但是,每当我运行这个查询时,我得到以下异常:

Index was out of range. Must be non-negative and less than the size of the 
collection. Parameter name: index 

我说得对不对,当我说的是,目前,LINQ到NHibernate的不支持ToLower()?如果是这样,是否有一种替代方法可以让我在Linq和NHibernate兼容的另一个字符串中搜索字符串?例如,如果用户搜索kap,我需要它匹配Kapiolani,MakapuuLapkap

+0

为什么你认为问题在于调用ToLower() - 它是一个在String类上定义的标准方法,应该和NHibernate的LINQ无关。源代码中的哪一行会得到异常? – Slavo 2010-04-08 07:55:58

+1

在'results.Count()'上,因为那是它的评估时间。并且它对于使用NHibernate的Linq很有帮助,因为它需要将它转换为SQL。 – 2010-04-08 08:08:58

+0

该Linq提供程序是相当古老,并没有更新一段时间。它可能工作,但你也可能想尝试在NHibernate中继中更新的Linq提供程序。 – 2010-04-08 09:22:12

回答

10

我最近这种情况发生。我可以告诉你,ToLower()不起作用,Contains()和StartsWith()可以工作,而且不区分大小写。您可以直接使用Contains()和StartsWith()来获得所需的效果。

+0

Doh,我无法相信我没有注意到'Contains()'和'StartsWith()'是不区分大小写的。我昨天浪费了5个小时,试图让'ToLower()'在它已经实现时工作! – 2010-04-08 20:04:01

1

根据comments在这两个博客posts这个功能是not implemented yet

+0

NHUsers Google网上论坛线程实际上暗示它确实有效。 – 2010-04-08 09:21:16

+0

@Michael,我在这个帖子中没有找到任何证据表明它有效。 – 2010-04-08 09:37:10

0

您可能需要确认数据库是否使用区分大小写。

如果没有,那么你不需要.ToLower()

10

围绕这个问题似乎有很多困惑。

  • “旧”Linq提供程序(对于NHibernate 2.x)可能不支持这一点。如果是这样的话,它永远不会因为它不再被维护。
  • 新的供应商(包括与NHibernate 3.X)确实支持它(虽然ToUpper的和tolower似乎倒,看http://groups.google.com/group/nhibernate-development/browse_thread/thread/a167216e466b3241
  • ContainsStartsWith映射到LIKE运营商SQL。他们是而不是本身不区分大小写;这是使它们不区分大小写的排序规则,这取决于您的列/架构是如何创建的。

更新(2010-04-09):错误确认,并提交补丁,请参阅https://nhibernate.jira.com/browse/NH-2169

更新(2010-05-21):贴片用于在2010-05-01并且现在预期工作。

+0

那么,哪个版本有修复? – 2012-02-27 09:29:18

+0

@LouisRhys只是得到最新的稳定。 – 2012-02-27 11:24:15