【问题标题】:Using NHibernate function to filter results with QueryOver使用 NHibernate 函数通过 QueryOver 过滤结果
【发布时间】:2014-05-08 14:23:31
【问题描述】:

我正在尝试使用 SQL 函数来过滤查询结果。我在 SQL 中有一个名为 SplitKeys 的函数,它接受一个 csv 字符串并返回一个整数表。我想生成以下 SQL(或接近它):

select * from Members where MemberKey in (select * from SplitKeys('1,2,3'))

我正在使用 QueryOver,但似乎无法生成该 where 子句。由于我无法让它工作,我创建了另一个函数,它接受一个字符串和 id,如果它在列表中,则返回 id,否则返回 -1。

session.QueryOver<Member>().Where(
    Restrictions.Ge(
        Projections.SqlFunction(
            "dbo.IsKeyInList",
            NHibernateUtil.StringClob,
            new[]
            {
                Projections.Constant(
                    keyList,
                    NHibernateUtil.StringClob),
                Projections.Constant(',', NHibernateUtil.Character),
                Projections.Property<Member>(x => x.MemberKey)
            }),
    0));

这很好用,只是速度很慢。对于第一个查询,该函数被调用一次,然后它可以根据表进行过滤。在第二个中,它为每一行调用该函数。

我最初将其作为整数列表并将其传入。但是,问题在于列表中的每个元素都是 SQL 中的一个参数,最大参数是 2100。

session.QueryOver().WhereRestrictionOn(x => x.MemberKey).IsInG(intKeyList);

我看了又看,似乎无法找到这样做的人或让 NHibernate 和 C# 编译器喜欢它。我试过这个,但它不起作用。此变体和其他变体要么引发 System.In32 的无映射异常,要么不返回任何内容。

var keys =
    session.QueryOver<MemberKey>()
        .Select(
            Projections.SqlFunction(
                "dbo.SplitKeysCSV",
                NHibernateUtil.StringClob,
                new[] { 
                    Projections.Constant(keyList),
                    Projections.Constant(delimiter),
                }));

我尝试为结果创建某种映射,但我不能这样做,因为没有表格。我尝试使用 .In() 函数,但它不接受 Projects.SqlFunction。

【问题讨论】:

    标签: c# mysql sql sql-server nhibernate


    【解决方案1】:

    您可以使用 SqlCriterion 来做到这一点:

    var sqlCrit = new SQLCriterion("{alias}.MemberKey in (SELECT * FROM dbo.SplitKeys(?))",
                    new[]{ keyList }, new IType[]{ NHibernateUtil.String })
    var keys = session.QueryOver<Member>()
                .Where(sqlCrit)
    

    【讨论】:

    • 是的,成功了。几乎。两个细微的变化。它是 {alias}.MemberKey,你必须调用 SqlString.parse 而不是 new SqlString()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    相关资源
    最近更新 更多