Как добавить ограничение для внутреннего соединения? - PullRequest
0 голосов
/ 22 октября 2010

У меня есть следующий NHibernate DetatchedCriteria,

return DetachedCriteria.For<MMFund>()
    .CreateCriteria<MMFund>(x => x.DataUniverse)
    .Add<DataUniverse>(x => x.SiteId == 100)
    .SetProjection(LambdaProjection.Property<MMFund>(x => x.FundId));

, который выдает следующий SQL:

and
    this_.ShareClassReturn_ShareClassId in 
    (
        SELECT f.[Fund_ID] as y0_
        FROM   
            dbo.Fund f inner join CAP.DataUniverse du
              on f.[Fund_TypeID] = du.[DataUniverse_TypeId]
                 and f.[Fund_CountryID] = du.[DataUniverse_CountryID]
        WHERE  fu.[DataUniverse_SiteId] = 100
    )

В DataUniverse много средств.

Iнеобходимо отфильтровать это так, чтобы я мог выбрать только средства с идентификатором страны 'ET', чтобы мой запрос выглядел следующим образом:

and
    scr.ShareClassReturn_ShareClassId in 
    (
        /* Get funds in universe */
        SELECT f.[Fund_ID] as y0_
        FROM   dbo.Fund f inner join CAP.DataUniverse du
                    on f.[Fund_TypeID] = du.[DataUniverse_TypeId]
                    and f.[Fund_CountryID] = 'ET' // these are the guys I need
        WHERE  du.[DataUniverse_SiteId] = 100 
    )

Однако я не уверен, что мне нужно делатьв DetachedCriteria для того, чтобы это произошло.У меня проблема в том, что независимо от того, что я делаю, он помещает предложение в неправильное место, например

WHERE  du.[DataUniverse_SiteId] = 100  and f.Fund_CountryId = 'ET'

, когда я добавляю строку .Add(Restrictions.Eq("CountryId", "ET")) следующим образом

return DetachedCriteria.For<MMFund>()
    .Add(Restrictions.Eq("CountryId", "ET"))
    .CreateCriteria<MMFund>(x => x.DataUniverse)
    .Add<DataUniverse>(x => x.SiteId == 100)
    .SetProjection(LambdaProjection.Property<MMFund>(x => x.FundId));

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

return DetachedCriteria.For<MMFund>()
    .CreateCriteria<MMFund>(x => x.DataUniverse)
        .Add(Restrictions.Eq("CountryId", "ET"))
    .Add<DataUniverse>(x => x.SiteId == 100)
    .SetProjection(LambdaProjection.Property<MMFund>(x => x.FundId));

, который производит это;

WHERE  du.[DataUniverse_SiteId] = 100  and du.[DataUniverse_CountryID] = 'ET'

** примечание - поскольку я использую Criteria API, на самом деле это ограничение, которое я использую:

.Add<MMFund>(f => f.CountryId == "ET")

Я использовал терминологию Restriction, потому что она более понятна тому, что я 'Я пытаюсь достичь.API Criteria и другой способ дают одинаковые результаты.

1 Ответ

0 голосов
/ 22 октября 2010

Почему, по вашему мнению, Where не подходит для фильтра? Вот где происходит фильтрация.

Сгенерированный SQL выглядит нормально. У вас есть две таблицы, объединенные по их общим полям. Предложение Where предоставляет соответствующую фильтрующую информацию. Если бы ваш предпочитаемый оператор SQL был на месте, вы бы объединили данные только по TypeID, а не по CountryID.

Например, скажем, ваша таблица Fund выглядит следующим образом

TypeID    CountryID
1         1
1         2
2         1
2         2
3         1
4         1

А ваша DataUniverse таблица следующая

TypeID    CountryID
1         1
1         2
1         3
2         1
2         2
2         3
3         1
3         2
4         1
4         2

Если бы вы написали SQL, как , по вашему желанию , вы бы произвели объединение на основе TypeID и фильтровали бы, например, Fund.CountryID = 1. Как будет выглядеть ваш продукт?

F.TypeID    F.CountryID    D.TypeID    D.CountryID
1           1              1           1
1           1              1           2
1           1              1           3
2           1              2           1
2           1              2           2
2           1              2           3
3           1              3           1
3           1              3           2
4           1              4           1 
4           1              4           2

Это ваш желаемый результат? Да, вы отфильтровали Fund.CountryID, но ваше объединение было только на TypeID, поэтому вы получили все записи из DataUniverse с этим подходящим типом для каждого Fund.

При объединении двух полей и Where, фильтрующем CountryID, результат будет следующим

F.TypeID    F.CountryID    D.TypeID    D.CountryID
1           1              1           1
2           1              2           1
3           1              3           1
4           1              4           1 

Вопрос в том, какой набор данных вы ожидаете?

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