我有以下NHIBERNATE的检测标准,
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
)
数据世界中有许多资金。
我需要对其进行筛选,以便只能选择国家ID为“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
)
但是,我不确定我需要对分离的标准做什么才能做到这一点。我所面临的问题是,无论我做什么,都会把这个条款放错地方,比如
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));
或者当我指定限制应该是第二个的一部分时,它试图完全过滤错误的表。CreateCriterials,例如
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'
**注意-在我使用标准API时,这实际上是我使用的限制:
.Add<MMFund>(f => f.CountryId == "ET")
我用了
Restriction
术语,因为它更明确地表达了我想要实现的目标。标准API和其他方法产生的结果完全相同。