我能在NHibernate QueryOver中使用SQL函数吗?

11

我一直在网上搜索,但找不到如何使用nhibernate 3.0的queryover的示例。 例如,我想在where子句中使用字符串函数。

var item = Query.Where(x => x.Name.ToLower() == name.ToLower()).FirstOrDefault();

但是这样不起作用,因为NHibernate无法理解ToLower,那么如何以一种方式扩展方言,使其成为可能呢?

2个回答

10
session.QueryOver<Foo>()
    .Where(Restrictions.Eq(
        Projections.SqlFunction("lower", NHibernateUtil.String, 
            Projections.Property<Foo>(x => x.Name)),
        name.ToLower()))

应该得到类似于 where lower(Name) = @p0 的 SQL 语句。


嗨,谢谢回复,它确实起作用了,你不知道我为这个解决方案搜索了多久和付出了多少努力。谢谢。 - Ruben Monteiro
@Ruben Monteiro 没问题,我发现有时在使用 QueryOver 时需要混合一些 Criteria。 - dotjoe

0

我相信它至少在我使用的版本(3.0.0.4000)中有效...以下是我的示例...

var reasons = _session.Query<Reason>();
var myReason = (from r in reasons 
                where r.IsCritical 
                   && r.ReasonCode.ToUpper() == reasonCode.ToUpper() 
               select r).FirstOrDefault();

试一试,如果可以的话,请告诉我...


这会导致在SQLServer中使用UPPER()函数的where子句...(这可能对性能不利...FYI) - Todd
我尝试了这个变量查询:var query = Session.GetISession().QueryOver<Budget>(); var item = (from f in query where f.Description.ToLower() == description.ToLower() select f).List().FirstOrDefault(); 但是出现了错误信息“在表达式f.Description.ToUpper()中未识别的方法调用”,我的nHibernate版本是3.1.0.4000,@Todd - 我知道性能问题,但我必须以这种方式实现。 - Ruben Monteiro
有趣的是...你说得对,当你使用QueryOver语法时它不起作用...我猜有一天这个问题会被解决...根据你的需求,你可以转而使用Query语法,这样它应该能够工作...你的代码将会更新如下... - Todd
变量查询 = Session.GetISession().Query<Budget>(); 变量项 = (from f in 查询 where f.Description.ToLower() == description.ToLower() select f).FirstOrDefault(); - Todd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接