簡體   English   中英

流利的nHibernate連接ID和null值

[英]Fluent nHibernate join id and null values

我認為我現在已經以各種可能的方式搜索了Internet,但找不到答案,或者可能只是對答案的理解不足,無法將其實施到當前項目中。 因此,我對這里的解決方案感到非常滿意。

這與計划有關,並且如圖所示,我有一台機器,該機器在一周的任何時間運行。 但是,在“非生產”表中,我有一個時間跨度(estimatedStart -estimatedStop),在這里不可能進行生產。 非生產記錄可以用於特定機器-但也可以用於公司。 在這種情況下,machineID將為null。

因此,我要選擇一台具有所有nonProduction記錄和machineId為null的nonProduction記錄的機器。

來自MySQL的圖

SQL語句非常簡單!

select * from machine m
left outer join nonproduction np on (m.machine_id = np.machineID or np.machineID is null)
where m.machine_id=119;

上述SQL的選擇結果

我的流利機器映射在這里:(為清晰起見,一些代碼已刪除)

public class MachineMap : ClassMap<Machine>
    {
        public MachineMap()
        {
            Table("machine");
            Id(x => x.MachineId, "machine_id").GeneratedBy.Identity();
            Map(x => x.Name, "name");
            Map(x => x.Number, "machinenumber");
            Map(x => x.Size, "size");
            Map(x => x.Data1, "data1");
            Map(x => x.Data2, "data2");
            Map(x => x.Data3, "data3");

            HasMany(x => x.NonProductions)
                .KeyColumn("machineID").KeyNullable()
                .AsBag();

        }
    }

public class NonProductionMap : ClassMap<NonProduction>
        {
            public NonProductionMap()
            {
                Table("nonproduction");
                Id(x => x.NonproductionId, "Nonproduction_id").GeneratedBy.Identity();
                Map(x => x.NonproductionTypeId, "nonproduction_typeID");
                Map(x => x.MachineId, "machineID").Nullable();
                Map(x => x.WorkerId, "workerID");
                Map(x => x.EstimatedStart, "estimated_start");
                Map(x => x.EstimatedStop, "estimated_stop");
                Map(x => x.Visible, "nonproductionvisible");
                Map(x => x.Repetitiontime, "repetitiontime");

                References(x => x.Machine)
                    .Column("machineID")
                    .Not.Insert()
                    .Not.Update();
            }
        }

此處的存儲庫代碼:

public IEnumerable<Machine> GetMachinesForCalendar(int[] ids = null)
    {
        Machine m = null;
        Order o = null;
        NonProduction n = null;

        var query = Session.QueryOver(() => m)
            .JoinAlias(() => m.Orders, () => o, JoinType.LeftOuterJoin)
            .JoinAlias(() => m.NonProductions, () => n, JoinType.LeftOuterJoin, Restrictions.Where(() => n.MachineId == m.MachineId || n.MachineId == null));

        if (ids != null && ids.Any())
        {
            query = query
                .WhereRestrictionOn(() => m.MachineId)
                .IsIn(ids);
        }

        return query
            .List()
            .Distinct()
            .ToList();

    }

我知道限制部分暗含了“ n.MachineId == m.MachineId”,但是當我開始寫時,我真的在這里找不到很好的解決方案。

我不得不提到,該數據庫非常老,並且包含很多數據,因此很遺憾無法重新設計它。 :(

我不認為通過映射是可行的。

我會在一對多中僅映射機器綁定的nonProduction實體。

通用查詢(沒有計算機ID)將通過專用查詢加載,您將合並兩個列表以進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM