Как получить результаты, которые начинаются с числа с NHibernate? - PullRequest
0 голосов
/ 07 июля 2010

У меня есть таблица с полем Имя, содержащая данные, подобные следующим:

a1
a2
b1
c1
1a
1b

9b

Я пытаюсь выбрать только те значения строк, которые начинаются с цифры.

Я пытаюсь сделать это с помощью следующего запроса, но он не работает:

var numberGroups = _session
    .CreateCriteria<CompanyGroupInfo>()
    .Add(SqlExpression.Between<CompanyGroupInfo>(g => int.Parse(g.Name.Substring(0, 1)), 0, 9))
    .List<CompanyGroupInfo>();

Выдает ошибку:

Unrecognised method call in epression Parse(g.Name.Substring(0, 1)) обратите внимание на опечатку 'выражения' - это NHibernate, а не я: -)

Может кто-нибудь подсказать, как мне достичь желаемого результата? Спасибо

edit: Я попробовал приведенные ниже предложения Джона, а также SqlExpression.Not<CompanyGroupInfo>(g => !char.IsLetter(g.Name.Substring(0, 1).ToCharArray()[0])), но все они выдают ошибки, подобные тому, что я написал выше.

Ответы [ 4 ]

1 голос
/ 07 июля 2010

ИМО, это лучше подходит для HQL, чем критерии.

Вариант ответа Джейми:

_session.CreateQuery(
        "from CompanyGroupInfo where substring(Name, 1, 1) between '0' and '9'")
        .List<CompanyGroupInfo>();

В любом случае, если вы действительно, действительно хотите использовать критерии ... вот оно:

_session.CreateCriteria<CompanyGroupInfo>()
        .Add(Restrictions.Between(
             Projections.SqlFunction("substring",
                                     NHibernateUtil.String,
                                     Projections.Property("Name"),
                                     Projections.Constant(1),
                                     Projections.Constant(1)),
             "0", "9"))
        .List<CompanyGroupInfo>();
1 голос
/ 07 июля 2010

Я ни в коем случае не гуру NHibernate, но вы пробовали:

SqlExpression.Between<CompanyGroupInfo>(g => g.Name.Substring(0, 1), "0", "9")

или

SqlExpression.Between<CompanyGroupInfo>(g => g.Name[0], '0', '9')

?

0 голосов
/ 07 июля 2010

Можете ли вы уйти с наивным решением?

_session.CreateQuery("from CompanyGroupInfo where Name < 'a'")
    .List<CompanyGroupInfo>();

Результаты зависят от порядка сопоставления базы данных и данных Name, содержащих только буквы и цифры.

0 голосов
/ 07 июля 2010

Оказывается, это работает:

var numberGroups = _session
    .CreateCriteria<CompanyGroupInfo>()
    .Add(SqlExpression.Not<CompanyGroupInfo>(/* where other criteria doesn't apply*/)
    .List<CompanyGroupInfo>()
    .Where(xx => char.IsDigit(xx.Name.Substring(0, 1).ToCharArray()[0]));

Но я боюсь, что это может быть неэффективно, потому что я получаю полный набор результатов в список, а затем фильтрую список. Я открыт для других предложений, если они доступны.

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