NHibernate LINQ是否支持Where()子句中的ToLower()?

时间:2010-04-08 07:24:26

标签: linq nhibernate linq-to-nhibernate

我有一个实体及其映射:

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,我需要它来匹配KapiolaniMakapuuLapkap

5 个答案:

答案 0 :(得分:11)

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

  • “旧的”Linq提供程序(对于NHibernate 2.x)可能不支持这一点。如果是这样的话,它永远不会,因为它不再被维护。
  • 新提供程序(包含在NHibernate 3.x中)确实支持它(尽管ToUpper和ToLower似乎已被反转,请参阅http://groups.google.com/group/nhibernate-development/browse_thread/thread/a167216e466b3241
  • ContainsStartsWith映射到SQL中的LIKE运算符。他们自己不区分大小写;它的排序规则使它们不区分大小写,因此这取决于列/模式的创建方式。

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

更新(2010-05-21):补丁已于2010-05-01应用,现在正常运作。

答案 1 :(得分:10)

我最近发生了这件事。我可以告诉你,ToLower()不起作用,并且Contains()和StartsWith()确实有效并且不区分大小写。您可以直接使用Contains()和StartsWith()来获得所需的效果。

答案 2 :(得分:1)

根据这两个博客comments中的posts,此功能为not implemented yet

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

可接受的答案提到使用Contains()和StartsWith()都很好。但是在您要确保两个字符串相同的情况下将无法使用。

使用“ ==”就足够了,因为它也不区分大小写。因此,您不再需要使用ToLower()或ToUpper();