2010-07-07 27 views
0

我有一個表與包含類似於以下的數據的名稱字段:如何獲得以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的,不是我:-)

有人可以建議我如何才能達到我期待的結果嗎?謝謝

編輯:我試過喬恩的建議,以及SqlExpression.Not<CompanyGroupInfo>(g => !char.IsLetter(g.Name.Substring(0, 1).ToCharArray()[0])),但他們都拋出類似的錯誤,我上面發佈。

+0

類似或一模一樣? – 2010-07-07 15:00:58

+0

類似的,它代替'eppression Parse(g.Name.Substring(0,1))'中的'無法識別的方法調用',它將是'epression中的無法識別的方法調用g.Name.get_Chars(0)'或'Unrecognized method調用Epression IsLetter(g.Name.Substring(0,1).ToCharArray()[0])' – DaveDev 2010-07-07 15:30:37

回答

1

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

謝謝,這個工程。你可以評論一下這個解決方案的效率嗎? – DaveDev 2010-07-08 08:34:09

+0

呃,當然這樣更有效率,因爲所有的過濾都是在服務器中完成的。而且,如果您在*名稱*上有索引,則會使用索引掃描完成。 – 2010-07-08 11:03:42

1

我不以任何方式的NHibernate的大師,但你有沒有嘗試過:

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

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

+0

是的,我試過那些無濟於事,以及'SqlExpression.Not (g =>!char .IsLetter(g.Name。Substring(0,1).ToCharArray()[0]))'..我想我必須從錯誤的角度來看這個。對於我來說,將完整的結果集放入List中可能會更容易,並使用良好的ol對其進行過濾。 – DaveDev 2010-07-07 14:36:24

+1

@DaveDev:請列出您在問題中嘗試過的內容,以及結果是什麼。然後我們可以幫助調整建議,或者至少避免提出相同的建議。 – 2010-07-07 14:45:07

+0

不要誤解我的意思 - 我在你建議他們之後嘗試了這些。但是,我會用這些更新這個問題。謝謝 – DaveDev 2010-07-07 14:47:17

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

但我怕,因爲我得到充分的結果集到一個列表中,然後過濾列表它可能是低效的。如果可用,我願意接受其他建議。

0

你可以逃脫一個天真的解決方案嗎?

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

結果取決於數據庫歸類順序和僅包含字母和數字的名稱數據。