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

Dan*_* T. 14 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试对它运行查询(将其从数据库中取出):

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
Run Code Online (Sandbox Code Playgroud)

但是,每当我运行此查询时,我都会收到以下异常:

Index was out of range. Must be non-negative and less than the size of the
collection. Parameter name: index
Run Code Online (Sandbox Code Playgroud)

我是说对了,目前,Linq对NHibernate不支持ToLower()?如果是这样,是否有一个替代方案允许我在Linq到NHibernate兼容的另一个字符串的中间搜索一个字符串?例如,如果用户搜索kap,我需要它来搭配Kapiolani,MakapuuLapkap.

Die*_*hon 11

围绕这个问题似乎有很多混乱.

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

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

更新(2010-05-21):补丁已应用于2010-05-01,现在按预期工作.


ddc*_*660 10

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