我有一个实体及其映射:
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
,Makapuu
和Lapkap
。
答案 0 :(得分:11)
围绕这个问题似乎有很多困惑。
Contains
和StartsWith
映射到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();