Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Fluent nHibernate连接id和空值_C#_Join_Nhibernate_Asp.net Mvc 5_Fluent - Fatal编程技术网

C# Fluent nHibernate连接id和空值

C# Fluent nHibernate连接id和空值,c#,join,nhibernate,asp.net-mvc-5,fluent,C#,Join,Nhibernate,Asp.net Mvc 5,Fluent,我想我现在已经用各种可能的方式搜索了互联网,但我没有找到答案,或者可能只是没有很好地理解答案,无法将其应用到我当前的项目中。所以我很高兴这里有一个解决方案 它是关于计划的,如图所示,我有一台机器,可以在一周中的任何时间运行。但是,在“非生产”表中,我有时间跨度(estimatedStart-estimatedStop),其中生产是不可能的。非生产记录可以是针对特定机器的,也可以是针对公司的。在这种情况下,machineID将为null 所以,我想选择一台机器,它有所有的非生产记录和非生产记录,其

我想我现在已经用各种可能的方式搜索了互联网,但我没有找到答案,或者可能只是没有很好地理解答案,无法将其应用到我当前的项目中。所以我很高兴这里有一个解决方案

它是关于计划的,如图所示,我有一台机器,可以在一周中的任何时间运行。但是,在“非生产”表中,我有时间跨度(estimatedStart-estimatedStop),其中生产是不可能的。非生产记录可以是针对特定机器的,也可以是针对公司的。在这种情况下,machineID将为null

所以,我想选择一台机器,它有所有的非生产记录和非生产记录,其中machineId为null

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;

我流畅的机器映射如下:(为了清晰起见,删除了一些代码)

公共类机器映射:类映射
{
公共机器映射()
{
表(“机器”);
Id(x=>x.MachineId,“machine_Id”).GeneratedBy.Identity();
映射(x=>x.Name,“Name”);
映射(x=>x.编号,“机器编号”);
地图(x=>x.大小,“大小”);
Map(x=>x.Data1,“Data1”);
Map(x=>x.Data2,“Data2”);
Map(x=>x.Data3,“Data3”);
HasMany(x=>x.非生产)
.KeyColumn(“machineID”).KeyNullable()
.AsBag();
}
}
公共类非生产映射:类映射
{
公共非生产映射()
{
表(“非生产”);
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”);
映射(x=>x.可见,“非生产可见”);
Map(x=>x.Repetitiontime,“Repetitiontime”);
引用(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();

    }
public IEnumerable GetMachinesForCalendar(int[]ids=null)
{
机器m=空;
顺序o=null;
非生产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())
{
查询=查询
.WhereRestrictionOn(()=>m.MachineId)
.IsIn(ids);
}
返回查询
.List()
.Distinct()
.ToList();
}
我知道限制部分中的“n.MachineId==m.MachineId”是隐含的,但是当我开始编写时,我真的找不到一个好的解决方案


我必须提到的是,该数据库非常陈旧,包含大量数据,因此很遗憾,无法对其进行重新设计(

我不相信映射可以做到这一点

我将只映射一对多机器绑定的非生产实体


一般的(没有机器id)将被一个专用的查询加载,你将合并两个列表进行处理。

在引用<代码>机器< /代码>时,你是否考虑过<代码> NoDebug < /代码>映射选项?它不便宜,性能明智,头脑。NoDebug映射与NHiBiNe一起工作了6年,但从未听说过。嗯,我马上就试试。:)
NotFound
用于处理“无效”外键值(目标实体表中不存在的ID),我看不出它有什么帮助。
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();

    }