我有一个名称字段的表,其中包含类似于以下内容的数据:
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]))
,但他们都犯了与我上面发布的相似的错误。
答案 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>();
结果取决于数据库归类顺序和仅包含字母和数字的名称数据。