代码之家  ›  专栏  ›  技术社区  ›  DaveDev

如何向内部联接添加限制?

  •  0
  • DaveDev  · 技术社区  · 15 年前

    我有以下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和其他方法产生的结果完全相同。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Anthony Pegram    15 年前

    Where 过滤器放错地方了吗?这就是过滤发生的地方。

    生成的SQL看起来不错。有两个表在它们的公共字段上进行了联接。这个 哪里 子句提供了适当的筛选信息。如果你的 首选 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 但是你的加入才刚刚开始 打字 ,所以所有记录都来自 数据世界 每个都有匹配的类型 基金

    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