我有以下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很多资金。
我需要过滤,这样我只能选择用“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'
**注 - 因为我使用的是标准的API,这其实是我使用的限制:
.Add<MMFund>(f => f.CountryId == "ET")
我用Restriction
术语,因为它更明确的什么,我努力实现。 Criteria API &另一种方式产生完全相同的结果。
你为什么认为'Where'是错误的地方? – 2010-10-22 17:45:12
对不起 - 我应该更清楚我的想法。这不是什么地方,这是错误的地方,它是'和f。[Fund_CountryID] ='ET'' – DaveDev 2010-10-22 17:57:40
不,我的意思是Where Where是过滤器的适当位置。我会扩大答案。 – 2010-10-22 18:55:25