У меня есть следующий 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 и другой способ дают одинаковые результаты.