2010-10-22 21 views
0

我有以下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 &另一种方式产生完全相同的结果。

+0

你为什么认为'Where'是错误的地方? – 2010-10-22 17:45:12

+0

对不起 - 我应该更清楚我的想法。这不是什么地方,这是错误的地方,它是'和f。[Fund_CountryID] ='ET'' – DaveDev 2010-10-22 17:57:40

+0

不,我的意思是Where Where是过滤器的适当位置。我会扩大答案。 – 2010-10-22 18:55:25

回答

0

为什么你认为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的匹配类型都为DataUniverse

随着加入的两个字段和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 

的问题是,这组数据是你所期望的吗?