NHibernate: CreateCriteria и Существует пункт

Хорошо Вы могли добавить a:

#pragma warning (disable : 4996)

перед использованием fopen но Вы рассмотрели использование fopen_s, поскольку предупреждение предлагает? Это возвращает код ошибки, разрешающий Вам проверять результат вызова функции.

проблема только с отключением функциональных предупреждений устаревших состоит в том, что Microsoft может удалить рассматриваемую функцию в более поздней версии CRT, повредив Ваш код (как указано ниже в комментариях, этого не произойдет в этом экземпляре с fopen, потому что это - часть C & стандарты ISO C++).

12
задан cbp 18 November 2009 в 00:14
поделиться

3 ответа

Я придумал, как это сделать, используя выражение IsNotEmpty. Здесь используются расширения NHibernate Lambda Extensions:

Session.CreateCriteria<FooBar>()
    .Add(SqlExpression.IsNotEmpty<FooBar>(x => x.Bazes))
    .List<FooBar>();
3
ответ дан 2 December 2019 в 04:09
поделиться

Here is how you can do it:

var fooBars = Session.CreateCriteria<FooBar>()
        .Add(Restrictions.IsNotEmpty("Bazs")).List<FooBar>();

...assuming there is a collection property (one-to-many) "Bazs" in the FooBar object.

Alternatively you could use detached criteria like that:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz")
        .SetProjection(Projections.Property("baz.FooBarId"))
        .Add(Restrictions.EqProperty("baz.FooBarId", "fooBar.Id"));

var fooBars = Session.CreateCriteria<FooBar>("fooBar")
        .Add(Subqueries.Exists(dCriteria)).List<FooBar>();
28
ответ дан 2 December 2019 в 04:09
поделиться

Только что решив связанную проблему и в конечном итоге придя к решению, я подумал, что поделюсь ответом здесь:

Предполагая, что вам нужен исходный запрос вопросов с дополнительным условием для подзапроса:

SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id
              AND Quantity = 5)

Предполагая у вас есть ссылка в классе Baz на родительский объект, называемый, скажем, FooBarRef [в классе Fluent Map вы должны использовать метод References ()], вы должны создать запрос следующим образом:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz")
        .SetProjection(Projections.Property("baz.FooBarId"))
        .Add(Expression.EqProperty("this.FooBarId", "FooBarRef.Id"))
        .Add(Expression.Eq("baz.Quantity", 5));

var fooBars = Session.CreateCriteria<FooBar>("fooBar")
        .Add(Subqueries.Exists(dCriteria)).List<FooBar>();

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

5
ответ дан 2 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: