如何获得以NHibernate编号开头的结果?

时间:2010-07-07 14:16:06

标签: c# nhibernate

我有一个名称字段的表,其中包含类似于以下内容的数据:

A1
A2
B1
C1
1A
1B
2A
9b

我正在尝试仅选择以数字开头的行值。

我正在尝试使用以下查询执行此操作,但它不起作用:

var numberGroups = _session
    .CreateCriteria<CompanyGroupInfo>()
    .Add(SqlExpression.Between<CompanyGroupInfo>(g => int.Parse(g.Name.Substring(0, 1)), 0, 9))
    .List<CompanyGroupInfo>();

它正在抛出错误:

Unrecognised method call in epression Parse(g.Name.Substring(0, 1))注意'表达'错字 - 这是NHibernate,而不是我: - )

有人可以建议我如何实现我正在寻找的结果吗?感谢

编辑:我在下面尝试了Jon的建议,以及SqlExpression.Not<CompanyGroupInfo>(g => !char.IsLetter(g.Name.Substring(0, 1).ToCharArray()[0])),但他们都犯了与我上面发布的相似的错误。

4 个答案:

答案 0 :(得分:1)

我无论如何都不是NHibernate的大师,但你试过了吗?

SqlExpression.Between<CompanyGroupInfo>(g => g.Name.Substring(0, 1), "0", "9")

SqlExpression.Between<CompanyGroupInfo>(g => g.Name[0], '0', '9')

答案 1 :(得分:1)

IMO,这比标准更适合HQL。

杰米回答的一个变种:

_session.CreateQuery(
        "from CompanyGroupInfo where substring(Name, 1, 1) between '0' and '9'")
        .List<CompanyGroupInfo>();

无论如何,如果你真的,真的想要使用Criteria ......在这里:

_session.CreateCriteria<CompanyGroupInfo>()
        .Add(Restrictions.Between(
             Projections.SqlFunction("substring",
                                     NHibernateUtil.String,
                                     Projections.Property("Name"),
                                     Projections.Constant(1),
                                     Projections.Constant(1)),
             "0", "9"))
        .List<CompanyGroupInfo>();

答案 2 :(得分:0)

事实证明这有效:

var numberGroups = _session
    .CreateCriteria<CompanyGroupInfo>()
    .Add(SqlExpression.Not<CompanyGroupInfo>(/* where other criteria doesn't apply*/)
    .List<CompanyGroupInfo>()
    .Where(xx => char.IsDigit(xx.Name.Substring(0, 1).ToCharArray()[0]));

但我担心它可能效率低下,因为我将完整的结果集放入列表中,然后过滤列表。如果可以的话,我愿意接受其他建议。

答案 3 :(得分:0)

你能逃脱一个天真的解决方案吗?

_session.CreateQuery("from CompanyGroupInfo where Name < 'a'")
    .List<CompanyGroupInfo>();

结果取决于数据库归类顺序和仅包含字母和数字的名称数据。