使用 Firebird 的“SUBSTR”函数进行查询 [关闭]
Posted
技术标签:
【中文标题】使用 Firebird 的“SUBSTR”函数进行查询 [关闭]【英文标题】:query using function “SUBSTR” of Firebird [closed] 【发布时间】:2016-09-12 13:57:18 【问题描述】:我需要使用带有linq-to-nhibernate、queryover 或nhibernate-criteria 的firebird SUBSTR
函数编写NHibernate 查询。我可能会使用hql 或SQL
,但这是我最后的选择。
有人有什么想法吗?以下示例查询将是我的 NHibernate 查询产生的 SQL:
SELECT *
FROM LANCAMENTO
WHERE SUBSTR(LAN_CD_CONTA, 1, 13) = :paramCd_Conta
【问题讨论】:
好吧,从 NHibernate 精通用户的角度来看,这个问题并不清楚,也许是我。奇怪的是,看起来更接近的选民在nhibernate 中没有一个点。 (但也许我检查他们的个人资料有点太快了。) 无论如何,马科斯,如果您希望它保留而不被删除,您应该编辑您的问题,也许是为了使其更明确,即使对于非 NH 用户也是如此。我至少要编辑语法,但作为一个“外国”编辑,我必须避免走得太“远”,我们必须保留原始的 OP(你)意图。 有点晚了,但我想知道,直接在 Linq lambda 中调用.SubString()
可能会导致调用 substr
Firebird 函数。 linq-to-nhibernate 确实支持字符串上的 .SubString()
。你试过吗?
是的,但我认为它 (.substring) 在您运行查询之后执行,而不是在您将查询发送到数据库时执行。
不,如果在实体属性上调用,它只能在 db 端运行,因为可查询对象不知道属性值。
【参考方案1】:
使用 Linq,声明一个 SubStr 扩展方法:
using NHibernate.Linq;
...
public static class CustomLinqExtensions
[LinqExtensionMethod("SUBSTR")]
public static string SubStr(this string dummy, int start, int length)
// No need to implement it in .Net, unless you wish to call it
// outside IQueryable context too.
throw new NotImplementedException("This call should be translated " +
"to SQL and run db side, but it has been run with .Net runtime");
然后在您的实体上使用它:
session.Query<Lancamento>()
.Where(l => l.CdConta.SubStr(1, 13) == cdConta)
.ToList();
请注意,尝试在不引用实体的情况下使用它会导致使用 .Net 运行时对其进行评估,而不是将其转换为 SQL。
【讨论】:
我用 SAME sql pure 做了,谢谢你的帮助。以上是关于使用 Firebird 的“SUBSTR”函数进行查询 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Symmetricds 时出现 Firebird 错误