C# 连接映射中的where子句

C# 连接映射中的where子句,c#,fluent-nhibernate,C#,Fluent Nhibernate,我有以下映射,但我不知道如何将where子句放入其中一个联接中。我只想加入operations表,其中OperationKind==“TASK”。你知道怎么做吗?在映射之外没有linq 我想要的sql看起来像 SELECT X.PHASE_S , PA.INTERVAL, PA.BOR, OP.DESCRIPTION FROM GG.PROJ_PHASE_X X inner join GG.PHASE PA on X.PHASE_S=PA.PHASE_S inner join GG.OP

我有以下映射,但我不知道如何将where子句放入其中一个联接中。我只想加入operations表,其中OperationKind==“TASK”。你知道怎么做吗?在映射之外没有linq

我想要的sql看起来像

SELECT X.PHASE_S , PA.INTERVAL, PA.BOR, OP.DESCRIPTION 
FROM GG.PROJ_PHASE_X X 
inner join GG.PHASE PA 
on X.PHASE_S=PA.PHASE_S 
inner join GG.OPERATIONS OP
ON X.PHASE_S = OP.PHASE_S
WHERE OP.OPERATION_KIND = 'TASK';
映射:

public class MySectionMap : ClassMap<MySectionEntity>
{
    public MySectionMap()
    {
        Schema("GG");
        Table("PROJ_PHASE_X");
        Id(x => x.PhaseS, "PHASE_S").GeneratedBy.TriggerIdentity();
        References(x => x.Project).Column("PROJECT_S").Cascade.None().Not.LazyLoad().Not.Nullable();
        Join("PHASE", m =>
                          {
                              m.Schema("GG");
                              m.Fetch.Join();
                              m.KeyColumn("PHASE_S");
                              m.Map(t => t.Interval).Column("INTERVAL");
                              m.Map(t => t.BorS).Column("BOR_S");
                          });
        Join("OPERATIONS", m => // ONLY JOIN WHERE OPERATION_KIND EQUALS TASK?
                               {
                                   m.Schema("GG");
                                   m.Fetch.Join();
                                   m.KeyColumn("PHASE_S");
                                   m.Map(t => t.Description).Column("DESCRIPTION");
                                   m.Map(t => t.OperationType).Column("OPERATION_KIND");
                               });

    }
}
公共类MySectionMap:ClassMap
{
公共地图()
{
模式(“GG”);
表(“项目十期”);
Id(x=>x.PhaseS,“PHASE_”).GeneratedBy.TriggerIdentity();
引用(x=>x.Project).Column(“Project_”).Cascade.None().Not.LazyLoad().Not.Nullable();
加入(“阶段”,m=>
{
m、 模式(“GG”);
m、 Fetch.Join();
m、 KeyColumn(“相位”);
m、 Map(t=>t.Interval)。列(“Interval”);
m、 Map(t=>t.BorS).列(“BOR_S”);
});
Join(“OPERATIONS”,m=>//仅当OPERATION\u KIND等于TASK时才进行Join?
{
m、 模式(“GG”);
m、 Fetch.Join();
m、 KeyColumn(“相位”);
m、 映射(t=>t.Description).Column(“Description”);
m、 Map(t=>t.OperationType).Column(“操作种类”);
});
}
}

Join
用于将多个表中的行简单合并到一个实体中。您试图实现的目标有点复杂-您试图过滤掉一些值,在SQL中,您使用的是
where
子句,而不是
join

您有两个选项-要么在数据库中创建一个视图,然后将实体映射到视图(操作方式与表完全相同)。或者第二个选项,更多代码方面是在映射级别上添加与您的
where
子句相对应的限制:

public MySectionMap()
{
    Schema("GG");
    Table("PROJ_PHASE_X");

    Join("PHASE", m => //...
    Join("OPERATIONS", //...

    Where("OPERATION_KIND = 'TASK'");
}

这个问题由来已久,但无论如何。我也有同样的问题(遗留数据库,不允许更改模式)。如果在where子句中,nhibernate将使用引发错误的第一个表的别名

我的解决方案是为联接定义一个视图,然后将该视图用作联接表。无法进入where子句的列也被映射(这样插入也可以工作)。在您的情况下,视图可能是:

CREATE VIEW FilteredOperations
    SELECT OP.PHASE_S, OP.DESCRIPTION, OP.OPERATION_KIND
    FROM  GG.OPERATIONS OP
    WHERE OP.OPERATION_KIND = 'TASK';
我的简历:

public class Agency : EntityBase
    {
        public const string AgencyRoleId = "F1776564-1CA0-11d5-A70C-00A0120802D7";

        public Agency()
        {
            CountryId = "de";
            LanguageId = "de";
        }

        public virtual string AgencyId { get; set; }
        public virtual string Name { get; set; }
        public virtual string UserDefinedName { get; set; }
        public virtual string LanguageId { get; set; }
        public virtual string CountryId { get; set; }
        public virtual string RoleId
        {
            get
            {
                return AgencyRoleId;
            }
            set {}
        }
    }

public AgencyMap()
        {
            Table("mgmt_location_102");
            Id(x => x.AgencyId, "LocationId").GeneratedBy.UuidHex("D");
            Map(x => x.CountryId, "CountryId");
            Map(x => x.LanguageId, "LanguageId");
            Map(x => x.Name,"CommonName");

            Join("mgmt_agency_ext", x=>
                                        {
                                            x.Optional();
                                            x.KeyColumn("AgencyLocationId");
                                            x.Map(y => y.UserDefinedName, "AgencyUserDefinedName");

                                        });

            Join("scs2.vAgencyRoles", x =>
            {
                x.KeyColumn("LocationId");
                x.Map(y => y.RoleId, "RoleId").Not.Update();
            });
        }

事实上,我正在做两个加入,我试图过滤。由于操作种类在操作表中,您的代码将无法工作。我曾经考虑过一个视图,但这会导致将数据保存回数据库时出现问题。
其中
可以包含任意SQL,因此它应该可以工作。你移除了你的连接吗?您应该把它放在那里。由于某种原因,where子句实际上被忽略了,它不会在输出sql中创建where。如何从db中获取对象?我获取一个项目,它有许多部分。