2017-08-07 30 views
0

我想創建一個投影,它將使用Levenshtein搜索距離計算從數據庫中篩選結果。要創建這個我打開一個會話到數據庫,然後用CreateCriteria查詢數據庫:NHibernate自定義投影小於或等於

... 
return session.CreateCriteria<Contact>() 
       .Add(Expression.Le(Levenshtein("FullName", "Bob"), 5) 
... 

創建了一個小的輔助方法返回投影類

public static LevenshteinProjection Levenshtein(string propertyName, string searchValue) 
{ 
    return new LevenshteinProjection(propertyName, searchValue); 
} 

本質上一切正常運作的新實例當創建字符串來編譯文本時很好,但是當我查看生成的SQL時,我想要小於或等於的值是?

... {rest of sql select} WHERE levenshtein(this_.full_name, 'Bob') <= ? 

爲什麼要添加?我給自己定的返回類型

public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuery) 
{ 
    return new IType[] { NHibernateUtil.Int32 }; 
} 

感謝

回答

0

的?代表參數佔位符。

NHibernate生成一個'參數化查詢'。它不是使用硬編碼的參數值創建查詢,而是生成一個包含參數的查詢。 該參數將被賦予您提供的值。

這使DBMS能夠緩存查詢執行計劃。

+0

在這種情況下,爲什麼不過濾數據? – Matt

+0

沒關係,我是愚蠢的,但看着這確實提高了我的SQL,因爲我在levenshtien中添加了第二個值作爲參數。我在顯示實際傳遞的參數的連接字符串中使用ShowSql(並運行sql得到相同的結果)。 – Matt

+0

另外,我需要了解<= and > = *之間的差異,令人失望的* – Matt