Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.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
如何使用nhibernate获取第一个表(项目)中不在第二个表(财务)中的记录以及外键引用_Nhibernate_Fluent Nhibernate - Fatal编程技术网

如何使用nhibernate获取第一个表(项目)中不在第二个表(财务)中的记录以及外键引用

如何使用nhibernate获取第一个表(项目)中不在第二个表(财务)中的记录以及外键引用,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我试图在nhibernate和MSSQL中查询一个简单的数据结构 dbo.Projects:Id(int,非null) dbo.financials:Id(int,非null)、ProjectId(int,非null)、dbo.projects的外键引用 我想获得projects表中的所有记录,这些记录不在Financials表中,因为Financials表有一个外键引用ProjectId。 我正在从EntityFramework迁移到(流畅的)Nhibernate 3 //So far

我试图在nhibernate和MSSQL中查询一个简单的数据结构

dbo.Projects:Id(int,非null)

dbo.financials:Id(int,非null)、ProjectId(int,非null)、dbo.projects的外键引用

我想获得projects表中的所有记录,这些记录不在Financials表中,因为Financials表有一个外键引用ProjectId。 我正在从EntityFramework迁移到(流畅的)Nhibernate 3

    //So far I have got here: 
    public IQueryable<ProjectModel> GetProjectsNotPresentInFinance()
    {
        var factory = Fluently.Configure()
            .Database(MsSqlConfiguration
                .MsSql2008
                    .ConnectionString(m_connectionString))
            .Mappings(m => m.FluentMappings
                .AddFromAssemblyOf<ProjectMap>()                   
               ).BuildSessionFactory();

        using (var session = factory.OpenSession())
        {
            var allprojects = session.QueryOver<ProjectModel>();
            var projectsToReturn = allprojects.List<ProjectModel>().AsQueryable();

       //---    Something like : all the records not in finances table ---------
       // .Where( proj => !db.Finances.Where(fin => fin.ProjectId == proj.Id).Any())
       // .Select(project => new ProjectModel
       // {
       //     Id=project.Id,
       //     ProjectName = project.ProjectName,                 
       // });

            return projectsToReturn;
        }            

    }



public class FinanceModel
{
    public virtual int Id { get; set; }
    public virtual int ProjectId { get; set; }       
}

public class ProjectModel
{
    public virtual int Id { get; set; }
    public virtual string ProjectName { get; set; }
}

public class ProjectMap:ClassMap<ProjectModel>
{
    public ProjectMap() {
        Table("Projects");
        Id(x => x.Id);
        Map(x => x.ProjectName);
    }
}

public class FinanceMap : ClassMap<FinanceModel>
{
    public FinanceMap()
    {
        Table("Finances");
        Id(x => x.Id);
        References(x => x.ProjectModel);
    }
}

    //-------------------------------------------------------
    //This is an Equivalent working code Using EntityFramework :
    public IQueryable<ProjectModel> GetProjectsNotPresentInFinance() {
        IQueryable<ProjectModel> projectList = db.Projects
        .Where( proj => !db.Finances.Where(fin => fin.ProjectId == proj.Id).Any())
        .Select(project => new ProjectModel
        {
            Id=project.Id,
            ProjectName = project.ProjectName,                 
        });
        return projectList;
    }
    //-------------------------------------------------------
//到目前为止我已经做到了:
公共可查询的GetProjectsNotPresentFinance()
{
var factory=fluntly.Configure()
.数据库(MSSQL)配置
.MsSql2008
.ConnectionString(m_ConnectionString))
.Mappings(m=>m.FluentMappings
.AddFromAssemblyOf()的
).BuildSessionFactory();
使用(var session=factory.OpenSession())
{
var allprojects=session.QueryOver();
var projectsToReturn=allprojects.List().AsQueryable();
//---类似于:财务表中没有的所有记录---------
//.Where(proj=>!db.financials.Where(fin=>fin.ProjectId==proj.Id).Any())
//.选择(项目=>新项目模型
// {
//Id=project.Id,
//ProjectName=project.ProjectName,
// });
返回项目StoreTurn;
}            
}
公共类融资模式
{
公共虚拟整数Id{get;set;}
公共虚拟整数投影{get;set;}
}
公共类项目模型
{
公共虚拟整数Id{get;set;}
公共虚拟字符串ProjectName{get;set;}
}
公共类ProjectMap:ClassMap
{
公共项目地图(){
表(“项目”);
Id(x=>x.Id);
映射(x=>x.ProjectName);
}
}
公共类财务地图:类地图
{
公共财政地图()
{
表(“财务”);
Id(x=>x.Id);
参考文献(x=>x.ProjectModel);
}
}
//-------------------------------------------------------
//这是使用EntityFramework的等效工作代码:
公共可查询的GetProjectsNotPresentFinance(){
IQueryable projectList=db.Projects
.Where(proj=>!db.financials.Where(fin=>fin.ProjectId==proj.Id).Any())
.选择(项目=>新项目模型
{
Id=project.Id,
ProjectName=project.ProjectName,
});
返回项目列表;
}
//-------------------------------------------------------

仔细想想,您可以使用子查询在不更改映射的情况下尝试此操作:

var notOrphanProjectIdsSubquery = QueryOver.Of<FinanceModel>()
                                    .Select(x => x.ProjectId);

var orphanProjects =  session.QueryOver<ProjectModel>()
                         .WithSubquery
                         .WhereProperty(x=>x.Id)
                         .NotIn(notOrphanProjectIdsSubquery)
                         .List();
我必须承认我不精通外语。我想类和映射应该是这样的,希望我没有把你放在错误的轨道上

public class FinanceModel
{
    public virtual int Id { get; set; }
    public virtual int ProjectId { get; set; }       
    public virtual ProjectModel Project{get;set;}
}

public class ProjectModel
{
    public virtual int Id { get; set; }
    public virtual string ProjectName { get; set; }
    public virtual IList<FinanceModel> Finances { get; set; }
}


public class ProjectMap:ClassMap<ProjectModel>
{
    public ProjectMap() {
        Table("Projects");
        Id(x => x.Id);
        Map(x => x.ProjectName);
        HasMany(x => x.Finances);
    }
}

public class FinanceMap : ClassMap<FinanceModel>
{
    public FinanceMap()
    {
        Table("Finances");
        Id(x => x.Id);
        References(x => x.Project);
    }
}
公共类融资模式
{
公共虚拟整数Id{get;set;}
公共虚拟整数投影{get;set;}
公共虚拟项目模型项目{get;set;}
}
公共类项目模型
{
公共虚拟整数Id{get;set;}
公共虚拟字符串ProjectName{get;set;}
公共虚拟IList{get;set;}
}
公共类ProjectMap:ClassMap
{
公共项目地图(){
表(“项目”);
Id(x=>x.Id);
映射(x=>x.ProjectName);
拥有许多(x=>x.5);
}
}
公共类财务地图:类地图
{
公共财政地图()
{
表(“财务”);
Id(x=>x.Id);
参考文献(x=>x.Project);
}
}

仔细想想,您可以使用子查询在不更改映射的情况下尝试此操作:

var notOrphanProjectIdsSubquery = QueryOver.Of<FinanceModel>()
                                    .Select(x => x.ProjectId);

var orphanProjects =  session.QueryOver<ProjectModel>()
                         .WithSubquery
                         .WhereProperty(x=>x.Id)
                         .NotIn(notOrphanProjectIdsSubquery)
                         .List();
我必须承认我不精通外语。我想类和映射应该是这样的,希望我没有把你放在错误的轨道上

public class FinanceModel
{
    public virtual int Id { get; set; }
    public virtual int ProjectId { get; set; }       
    public virtual ProjectModel Project{get;set;}
}

public class ProjectModel
{
    public virtual int Id { get; set; }
    public virtual string ProjectName { get; set; }
    public virtual IList<FinanceModel> Finances { get; set; }
}


public class ProjectMap:ClassMap<ProjectModel>
{
    public ProjectMap() {
        Table("Projects");
        Id(x => x.Id);
        Map(x => x.ProjectName);
        HasMany(x => x.Finances);
    }
}

public class FinanceMap : ClassMap<FinanceModel>
{
    public FinanceMap()
    {
        Table("Finances");
        Id(x => x.Id);
        References(x => x.Project);
    }
}
公共类融资模式
{
公共虚拟整数Id{get;set;}
公共虚拟整数投影{get;set;}
公共虚拟项目模型项目{get;set;}
}
公共类项目模型
{
公共虚拟整数Id{get;set;}
公共虚拟字符串ProjectName{get;set;}
公共虚拟IList{get;set;}
}
公共类ProjectMap:ClassMap
{
公共项目地图(){
表(“项目”);
Id(x=>x.Id);
映射(x=>x.ProjectName);
拥有许多(x=>x.5);
}
}
公共类财务地图:类地图
{
公共财政地图()
{
表(“财务”);
Id(x=>x.Id);
参考文献(x=>x.Project);
}
}

Hmm似乎不起作用。可能是我缺少一些映射。我有上面的映射类。感谢jbl的努力,但是有没有其他有效的方法可以更改映射,我会从存储库调用一个方法来获取数据?这仍然没有解决问题。@Rajesh:编辑了我的答案,思考了如何高效地实现你想要的,而不改变你的映射。嗯,似乎不起作用。可能是我缺少一些映射。我有上面的映射类。感谢jbl的努力,但是有没有其他有效的方法可以更改映射,我会从存储库调用一个方法来获取数据?这仍然没有解决问题。@Rajesh:编辑了我的答案,思考了如何高效地实现您想要的,而不改变您的映射。