Поиск с неравенствами по строковому свойству - PullRequest
1 голос
/ 30 мая 2020

Мы используем NHibernate поверх SQL Server и SQLite. База данных хранит записи в строках, а не в столбцах - каждая строка имеет Path|Value в качестве столбцов. Путь и значение являются свойствами string.

Для определенных значений Path мы хотели бы запросить неравенства - больше-чем, меньше-чем и т.д. c.

Проблема, с которой мы сталкиваемся, заключается в том, что, поскольку свойства являются строками, неравенства используют сравнения строк - например, поиск по запросу Value >= 18 возвращает строки, где Value = 5. К сожалению, у нас возникли проблемы с решением этой проблемы.

1) Это ограничение дает неверные результаты (например, 18 < 5):

Restrictions.Ge("Value", item.Value);

2) Мы попытались выполнить приведение значение в целое число, но этот код дает SqlException из NHibernate - Error converting data type nvarchar to bigint.

Restrictions.Le(Projections.Cast(NHibernateUtil.Int64, Projections.Property("SearchString")), item.Value)

3) Мы искали способ дополнить значение свойства нулями (чтобы мы получили 018 > 005), но не смогли найти способ сделать это в NHibernate.

Есть ли у кого-нибудь совет?
Заранее спасибо!

1 Ответ

1 голос
/ 01 июня 2020

Предполагается, что вы хотите сравнить целочисленное значение с IQueryOver:

1) Это ограничение дает неверные результаты (например, 18 <5): </p>

Restrictions.Ge("Value", item.Value);

Restrictions.Ge
    (
    Projections.Cast(NHibernateUtil.Int32, Projections.Property<YourEntity>(x => x.YourProperty))
        , intValue
    )

Преобразуйте ваш тип данных соответствующим образом. Если ваш C# тип данных (intValue) уже равен c, преобразовывать его не нужно. Если ваш x.YourProperty уже является типом numeri c, преобразовывать его не нужно. Отрегулируйте приведенный выше код соответствующим образом.

2) Мы попытались преобразовать значение в целое число, но этот код создает исключение SqlException из NHibernate -- Error converting data type nvarchar to bigint.

Restrictions.Le(Projections.Cast(NHibernateUtil.Int64, Projections.Property("SearchString")), item.Value)

См. Выше и проверьте тип данных item.Value.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...