Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获得以NHibernate数字开头的结果?_C#_Nhibernate - Fatal编程技术网

C# 如何获得以NHibernate数字开头的结果?

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

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

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>();
它抛出了一个错误:

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>();