Математические операции в nHibernate Criteria Query - PullRequest
1 голос
/ 03 июня 2010

У меня проблемы с запросом nHibernate.

У меня есть БД, в которой хранится информация об автомобиле, и пользователь может искать БД по марке, модели, типу и датам производства.

Марка, поиск по модели и типу - это нормально, работает с удовольствием, это даты производства, с которыми у меня возникли проблемы. Так что вот так ...

Даты хранятся в виде целых чисел (StartMonth, StartYear, FinishMonth, FinishYear), когда конечный пользователь выбирает дату, которая передается запросу как int, например, 2010006 (2010 * 100 + 6).

ниже является частью запроса, который я использую, к вашему сведению, который я использую Lambda Extensions .

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)

Любая помощь будет великолепна,

Привет

Rich

Ответы [ 2 ]

0 голосов
/ 03 июня 2010

@ Стефан, я пробовал следующее,

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

Я проверяю результаты с помощью различных комбинаций И ​​/ ИЛИ (т.е. ((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 - это вычисляемые столбцы в моей таблице и свойства моей сущности.

Я могу отредактировать это, когда наш гуру вернется на следующей неделе.

Спасибо и С уважением Рич

0 голосов
/ 03 июня 2010

Я не очень хорошо знаю эти расширения 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 с ниже чем.

Я не уверен, что лямбда-расширения поддерживают оператор "или" (||), подобный этому, но наверняка есть возможность для "или".


Комментарий Ричардса:

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