C# 如何获得以NHibernate数字开头的结果?
我有一个带有名称字段的表,其中包含类似于以下内容的数据: a1 a2 b1 c1 1a 1b 2a 9b 我试图只选择以数字开头的行值 我正试图通过以下查询执行此操作,但它不起作用:C# 如何获得以NHibernate数字开头的结果?,c#,nhibernate,C#,Nhibernate,我有一个带有名称字段的表,其中包含类似于以下内容的数据: a1 a2 b1 c1 1a 1b 2a 9b 我试图只选择以数字开头的行值 我正试图通过以下查询执行此操作,但它不起作用: var numberGroups = _session .CreateCriteria<CompanyGroupInfo>() .Add(SqlExpression.Between<CompanyGroupInfo>(g => int.Parse(g.Name.Subs
var numberGroups = _session
.CreateCriteria<CompanyGroupInfo>()
.Add(SqlExpression.Between<CompanyGroupInfo>(g => int.Parse(g.Name.Substring(0, 1)), 0, 9))
.List<CompanyGroupInfo>();
它抛出了一个错误:
epression Parseg.Name.Substring0中无法识别的方法调用,1请注意“表达式”输入错误-这是NHibernate,不是我:-
有人能建议我怎样才能达到我想要的结果吗?谢谢
编辑:我尝试了下面Jon的建议,以及SqlExpression.Notg=>!char.isleterg.Name.Substring0,1.ToCharArray[0]但它们都会抛出与我上面发布的内容类似的错误。我无论如何都不是NHibernate大师,但您尝试过:
SqlExpression.Between<CompanyGroupInfo>(g => g.Name.Substring(0, 1), "0", "9")
或
?事实证明这是可行的:
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]));
但我担心这样做可能效率低下,因为我将完整的结果集放入一个列表中,然后过滤该列表。如果有其他建议,我愿意接受。你能想出一个简单的解决方案吗
_session.CreateQuery("from CompanyGroupInfo where Name < 'a'")
.List<CompanyGroupInfo>();
结果取决于数据库排序顺序和仅包含字母和数字的名称数据。IMO,这比标准更适合HQL 杰米回答的一个变体:
_session.CreateQuery(
"from CompanyGroupInfo where substring(Name, 1, 1) between '0' and '9'")
.List<CompanyGroupInfo>();
无论如何,如果你真的,真的想使用标准。。。下面是:
_session.CreateCriteria<CompanyGroupInfo>()
.Add(Restrictions.Between(
Projections.SqlFunction("substring",
NHibernateUtil.String,
Projections.Property("Name"),
Projections.Constant(1),
Projections.Constant(1)),
"0", "9"))
.List<CompanyGroupInfo>();
是的,我试了这些都没用,还有SqlExpression.Notg=>!char.isleterg.Name.Substring0,1.ToCharArray[0]。。我想我一定是从错误的角度来的。对我来说,将完整的结果集放入一个列表中,并使用良好的ol'linq对其进行过滤可能会更容易-objects@DaveDev当前位置请列出您在问题中尝试过的内容以及结果。然后我们可以帮助调整一个建议,或者至少避免同样的建议。别误会我的意思,我在你提出建议后就试过了。但是是的,我会用这些更新问题。ThanksMilar,还是完全相同?相似之处在于,不是在epression Parseg.Name.Substring0,1中无法识别的方法调用,而是在epression g.Name.get_Chars0中无法识别的方法调用,或者在epression IsLetterg.Name.Substring0,1中无法识别的方法调用。ToCharray[0]谢谢,这很有效。与我在下面提出的解决方案相比,您能评论一下这个解决方案的效率吗?当然,这要有效得多,因为所有的过滤都是在服务器上完成的。而且,如果你在名字上有一个索引,它是通过索引扫描完成的。
_session.CreateCriteria<CompanyGroupInfo>()
.Add(Restrictions.Between(
Projections.SqlFunction("substring",
NHibernateUtil.String,
Projections.Property("Name"),
Projections.Constant(1),
Projections.Constant(1)),
"0", "9"))
.List<CompanyGroupInfo>();