Справка по критериям объединения nhibernate - PullRequest
1 голос
/ 01 июля 2011

У меня есть таблица DriverScans, которая присоединяется к DriverImages. Я хочу вернуть все DriverScan, где для любого DriverImage поле «Отправлено» равно false.

По существу

SELECT DriverScan.* 
FROM DriverScan
INNER JOIN DriverImages
ON DriverImages.DriverScanId = DriverScan.DriverScanId
WHERE DriverImages.Sent = 0

Приведенный ниже код только DriverScans, но созданный SQL-запрос возвращает внутреннее объединение DriverScan и DriverImages, которое включает поле изображения. Как мне написать код, чтобы SQL возвращал только информацию DriverScan?

public IEnumerable<DriverScan> GetNewScans()
{
    var session = GetCleanSession();
    var query = session.CreateCriteria(typeof(DriverScan));

    query.CreateCriteria("DriverImages", JoinType.InnerJoin)
        .Add(Cr.Restrictions.Eq("Sent", false));

    return query.List<DriverScan>();
}

Если применимо, мое отображение для DriverImages:

HasMany<DriverDoc>(x => x.DriverDocs)
   .WithKeyColumn("DriverScanId").IsInverse()
   .Cascade.AllDeleteOrphan().LazyLoad();

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Нужно ли использовать CreateCriteria? Вы можете сделать это довольно легко с HQL. Что-то в этом роде должно сделать для вас.

SELECT d
FROM DriverScan d
JOIN d.DriverImages i
WHERE i.Sent = 0
0 голосов
/ 01 июля 2011

Не проверено, и я не знаю, как вы отображаете DriverScan в DriverImage, но я думаю, что вы хотите что-то вроде этого:

var sentImagesQuery = DetachedCriteria.For<DriverImages>()
    .Add(Expression.Eq("Sent",false))
    .SetProjection(Projections.Property("DriverScan.Id"));

var results = session.CreateCriteria<DriverScan>()
    .Add(Subqueries.PropertyIn("Id",sentImagesQuery))
    .List<DriverScan>();

должен производить:

select *
from DriverScan d
where d.Id in (select DriverScanId from DriverImages where sent=0)

Теперь вы не загружаете столбец изображения, который замедлит ваш набор результатов. При желании в NH3 вы можете посмотреть «Lazy Properties», который будет лениво загружать свойство Image до тех пор, пока не потребуется.

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