在NHibernate中加入表

时间:2015-05-06 10:26:16

标签: nhibernate

我在下面有一个查询,如何重新创建这个以加入将使用NHibernate返回SurveyProjectNormDTO列表的表?有什么帮助吗?

              using (var session = OpenSession()){

                var projectGroupIds = session.Query<ReportingStructureNodeProjectGroups>()
                    .Where(x => x.NodeID == nodeId);

                    projectGroupIds.Fetch(x => x.ProjectGroupID).ToFuture();


                var projectIds = session.Query<ProjectGroup>().Where(p => projectGroupIds.Contains(p.Id));


                projectIds.Fetch(x => x.ProjectID).ToFuture();

                var projectNormProjects = session.Query<SurveyProjectNorm>().Where(x => projectIds.Contains(x.SurveyProjectId));

                projectNormProjects.Fetch(x => x.ShortLabels).ToFuture();
                projectNormProjects.Fetch(x => x.ReportingNames).ToFuture();
                projectNormProjects.Fetch(x => x.NormProject).ToFuture();

                var response = new List<SurveyProjectNormDTO>();

                projectNormProjects.ToList().ForEach(
                    p =>
                    {
                        response.Add(
                            new SurveyProjectNormDTO { Id = p.Id, ProjectName = p.NormProject.ProjectName, ReportingName = p.ReportingNames.Select(s => s.LocalizedText).FirstOrDefault() });
                    });

                return response;

1 个答案:

答案 0 :(得分:0)

我不确定这些let命令是否可以正常工作,但您可以试试这个。它将对获取属性的数据库执行单击。测试它,让我们知道它是否有效。

var queryResult  = (from p in session.Query<SurveyProjectNorm>()
            let projectGroupIds = session.Query<ReportingStructureNodeProjectGroups>().Where(x => x.NodeID == nodeId).Select(x => x.Id)
            let projectIds = session.Query<ProjectGroup>().Where(x => projectGroupIds.Contains(x.Id)).Select(x => x.Id)
            where projectIds.Contains(p.SurveyProjectId)
            select p)
              .Fetch(x => x.ShortLabels)
              .Fetch(x => x.ReportingNames)
              .Fetch(x => x.NormProject)
              .ToList();

var response = new List<SurveyProjectNormDTO>();

queryResult.ForEach(p =>
    response.Add(new SurveyProjectNormDTO { 
            Id = p.Id, 
            ProjectName = p.NormProject.ProjectName, 
            ReportingName = p.ReportingNames.Select(s => s.LocalizedText).FirstOrDefault() }));


return result;