Я согласен с SLaks в комментариях, что если вам нужно сравнение строк в поле идентификатора продукта, то это должно быть поле char
или varchar
для начала.
Является ли количество цифр в идентификаторе продукта постоянным?В этом случае вы могли бы написать что-то вроде:
session.Linq<Product>().Where(p=>p.Id >= 10000 && p.Id < 20000)
Даже если вы не знаете количество цифр, вы можете написать
session.Linq<Product>().Where(p=>
(p.Id >= 10 && p.Id < 20) ||
(p.Id >= 100 && p.Id < 200) ||
(p.Id >= 1000 && p.Id < 2000) ||
(p.Id >= 10000 && p.Id < 20000) || ... );
Ну, это уродливо, но это будетработа: -)
Кстати, вы можете получить первую цифру в T-SQL, используя следующее выражение:
(Product.Id / POWER(10, FLOOR(LOG10(Product.Id))))
Однако я не думаю, что поставщик Linq дляNHibernate 2.1.2 может отображать математические функции .Net в соответствующие функции T-SQL.Вы можете попробовать:
session.Linq<Product>().Where(p => p.Id / Math.Pow(10, Math.Floor(Math.Log10(p.Id))) == 1)