[英]Math operations in nHibernate Criteria Query
我在使用nHibernate查詢時遇到了麻煩。
我有一個存儲車輛信息的數據庫,用戶可以按制造商,型號,類型和生產日期搜索該數據庫。
制作,型號和類型搜索很好,可以請客,這是我遇到問題的日期。 所以這里...
當最終用戶選擇將日期作為整數傳遞給查詢的日期時,日期將以整數(StartMonth,StartYear,FinishMonth,FinishYear)的形式存儲,例如2010006(2010 * 100 + 6)。
以下是我正在使用的查詢的一部分,僅供參考,我正在使用Lambda擴展 。
if (_searchCriteria.ProductionStart > 0)
{
query.Add<Engine>(e => ((e.StartYear * 100) + e.StartMonth) >= _searchCriteria.ProductionStart);
}
if (_searchCriteria.ProductionEnd > 0)
{
query.Add<Engine>(e => ((e.FinishYear * 100) + e.FinishMonth) <= _searchCriteria.ProductionEnd);
}
但是當查詢運行時,我收到以下消息,
無法從((e.StartYear * 100)+ e.StartMonth)確定成員
任何幫助都會很棒,
問候
豐富
我不太了解這些linq擴展名,但是我認為您需要在操作前傳遞成員名稱。
int year = Math.Floor(_searchCriteria.ProductionStart / 100);
int month = _searchCriteria.ProductionStart % 100;
query.Add<Engine>(
(e => e.StartYear >= year);
|| (e => e.StartMonth >= month && e => e.StartYear >= year))
年份必須更大,或者年份至少等於且月份更大。 具有低於的ProductionEnd同樣適用。
我不確定lambda擴展是否支持像這樣的“或”( ||
)運算符,但是肯定存在“或”的可能性。
從理查茲評論:
query.Add(
Restrictions.Or(
Restrictions.And(
SqlExpression.CriterionFor<Engine>(e => e.StartMonth >= month),
SqlExpression.CriterionFor<Engine>(e => e.StartYear >= year)),
SqlExpression.CriterionFor<Engine>(e => e.StartYear >= year) ) );
@Stefan,我嘗試了以下方法,
if (_searchCriteria.ProductionStart > 0)
{
int sYear = (int) Math.Floor( (double) _searchCriteria.ProductionStart / 100);
int sMonth = _searchCriteria.ProductionStart % 100;
query.Add(
Restrictions.Or(
Restrictions.And(
SqlExpression.CriterionFor<Engine>(e => e.StartMonth >= sMonth),
SqlExpression.CriterionFor<Engine>(e => e.StartYear >= sYear)
),
SqlExpression.CriterionFor<Engine>(e => e.StartYear >= sYear)
)
);
}
if (_searchCriteria.ProductionEnd > 0)
{
int eYear = (int)Math.Floor((double)_searchCriteria.ProductionEnd / 100);
int eMonth = _searchCriteria.ProductionEnd % 100;
query.Add(
Restrictions.Or(
Restrictions.And(
SqlExpression.CriterionFor<Engine>(e => e.FinishMonth <= eMonth),
SqlExpression.CriterionFor<Engine>(e => e.FinishYear <= eYear)
),
SqlExpression.CriterionFor<Engine>(e => e.FinishYear <= eYear)
)
);
}
我用不同的AND / OR組合(即(((a && b)|| a)和(a ||(a && b))))檢查結果,並彈出了幾條記錄。
經過一番思考之后,我得出以下結論:
if (_searchCriteria.ProductionStart > 0)
{
query.Add<Engine>(e => e.StartDate >= _searchCriteria.ProductionStart);
}
if (_searchCriteria.ProductionEnd > 0)
{
query.Add<Engine>(e => e.FinishDate <= _searchCriteria.ProductionEnd);
}
其中StartDate
和FinishDate
是我的表中的計算列以及實體上的屬性。
下周我們的老師回來時,我可以編輯一下。
謝謝和問候豐富
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.