我正在開發一個應該允許對數據庫進行基本搜索的小項目。 目前我正在使用nhibernate進行數據庫交互。 在數據庫中我有2個表格:Person和Address。 Person表與Address有多對一的關係。如何使用nhibernate進行正確的搜索
代碼中,我想出了做搜索是:
public IList<T> GetByParameterList(List<QueryParameter> parameterList)
{
if (parameterList == null)
{
return GetAll();
}
using (ISession session = NHibernateHelper.OpenSession())
{
ICriteria criteria = session.CreateCriteria<T>();
foreach (QueryParameter param in parameterList)
{
switch (param.Constraint)
{
case ConstraintType.Less:
criteria.Add(Expression.Lt(param.ParameterName, param.ParameterValue));
break;
case ConstraintType.More:
criteria.Add(Expression.Gt(param.ParameterName, param.ParameterValue));
break;
case ConstraintType.LessOrEqual:
criteria.Add(Expression.Le(param.ParameterName, param.ParameterValue));
break;
case ConstraintType.EqualOrMore:
criteria.Add(Expression.Ge(param.ParameterName, param.ParameterValue));
break;
case ConstraintType.Equals:
criteria.Add(Expression.Eq(param.ParameterName, param.ParameterValue));
break;
case ConstraintType.Like:
criteria.Add(Expression.Like(param.ParameterName, param.ParameterValue));
break;
}
}
try
{
IList<T> result = criteria.List<T>();
return result;
}
catch
{
//TODO: Implement some exception handling
throw;
}
}
}
的查詢參數是,我用它來創建指標分析,並將其發送到DAL輔助對象,它看起來像這樣:
public class QueryParameter
{
public QueryParameter(string ParameterName, Object ParameterValue, ConstraintType constraintType)
{
this.ParameterName = ParameterName;
this.ParameterValue = ParameterValue;
this.Constraint = constraintType;
}
public string ParameterName
{
get;
set;
}
public Object ParameterValue
{
get;
set;
}
public ConstraintType Constraint
{
get;
set;
}
}
現在,如果我正在做一個像FirstName =「John」這樣的搜索,但不是當我嘗試給出一個像Street =「Some Street」這樣的參數時,效果很好。看來,nhibernate正在尋找Person表中的街道列,但不是在Address表中尋找。
任何想法應該如何改變我的代碼,以便我可以做一個適當的搜索?提示?也許有些替代品?
聲明:我是一個菜鳥,所以請溫柔;) 謝謝,丹尼斯。
事情是我真的不知道用戶正在搜索什麼,直到我收到搜索請求。我希望能夠使這種搜索通用(例如,如果我添加一些新的實體到域中,所以我不必更改代碼)。有什麼辦法可以告訴nhibernate做一個「級聯」(我不知道這是正確的詞)搜索? – 2010-05-27 17:13:33
我不認爲NHibernate(或任何ORM ......但我可能是錯的)可以爲你做這個。我建議你修改你的QueryParameter類和GetByParameterList方法來支持指定參數實際存在的子實體(如果它在主實體上不存在)。 – 2010-05-27 17:26:22
此外,您可能期望NHibernate爲您做的太多。它需要檢查所有主要實體的關聯是否存在該屬性......但是,那麼您希望它遞歸地遍歷整個對象樹來尋找屬性嗎?如果這樣做對你來說可能是很好的,但它看起來會對性能造成太大的影響。 – 2010-05-27 17:32:12