簡體   English   中英

nHibernate條件查詢中的數學運算

[英]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);
}

其中StartDateFinishDate是我的表中的計算列以及實體上的屬性。

下周我們的老師回來時,我可以編輯一下。

謝謝和問候豐富

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM