linq多表查询

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Otsuka.Application.Dal;
using Otsuka.Application.Bll.Common;
using Otsuka.Application.Common;
using Otsuka.Application.Bll.Dialog.ApplicationFind;

namespace Otsuka.Application.Bll.Dialog.ApplicationFind
{
    public class SearchApplicationBll : BllBaseEx
    {
        /// <summary>
        /// 要求キー-申請検索条件
        /// </summary>
        public const string REQUEST_KEY_APPLICATION_REQUEST = "APPLICATION_REQUEST";

        /// <summary>
        /// 返却キー-申請情報(複数件)
        /// </summary>
        public const string RESPONSE_KEY_APPLICATION_LIST = "APPLICATION_LIST";

        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        protected override Dictionary<string, object> Perform()
        {
            // 検索条件の取得
            SearchApplicationRequest request = (SearchApplicationRequest)Request[REQUEST_KEY_APPLICATION_REQUEST];

            var query = DataContext.TBAATR_APPLICATION.AsQueryable();
            var productsQuery = DataContext.TBAATR_PRODUCT.AsQueryable();

            if (!CheckUtility.IsEmpty(request.ApplicationNo))
            {
                // 申請番号
                query = query.Where(item => item.APPLI_NO == request.ApplicationNo);
                productsQuery = productsQuery.Where(item => item.APPLI_NO == request.ApplicationNo);
            }

            if (!CheckUtility.IsEmpty(request.MaterialsInfoCode))
            {
                // 資材媒体
                query = query.Where(item => item.MATERIALS_CODE == request.MaterialsInfoCode);
            }

            if (!CheckUtility.IsEmpty(request.MaterialsClassInfoCode))
            {
                // 資材分類
                query = query.Where(item => item.MATERIALS_CLASS_CODE == request.MaterialsClassInfoCode);
            }

            if (!CheckUtility.IsEmpty(request.UniformCode))
            {
                // 統一コード
                query = query.Where(item => item.UNIFORM_CODE == request.UniformCode);
            }

            if (!CheckUtility.IsEmpty(request.OrderPartCode))
            {
                // 発注品番
                query = query.Where(item => item.ORDER_PART_CODE == request.OrderPartCode);
            }

            if (!CheckUtility.IsEmpty(request.ApplicantDivisionCode))
            {
                // 申請部署
                query = query.Where(item => item.APPLICANT_DIVISION == request.ApplicantDivisionCode);
            }

            if (!CheckUtility.IsEmpty(request.ApplicantStaffCode))
            {
                // 申請者
                query = query.Where(item => item.APPLICANT_STF_CODE == request.ApplicantStaffCode);
            }

            if (!CheckUtility.IsEmpty(request.ApplicationDateStart))
            {
                // 申請日開始
                query = query.Where(item => item.APPLICATION_DATE.CompareTo(request.ApplicationDateStart.Replace("/", "") + "00") >= 0);
            }

            if (!CheckUtility.IsEmpty(request.ApplicationDateEnd))
            {
                // 申請日終了
                query = query.Where(item => item.APPLICATION_DATE.CompareTo(request.ApplicationDateEnd.Replace("/", "") + "99") <= 0);
            }

            if (!CheckUtility.IsEmpty(request.DrugCode))
            {
                // 薬剤
                query = query.Where(item => item.DRUG == request.DrugCode);
            }

            if (!CheckUtility.IsEmpty<string>(request.ProductCodes))
            {
                // 製品
                productsQuery = productsQuery.Where(item => request.ProductCodes.Contains(item.PROD_GRP_CODE));
            }

            if (!CheckUtility.IsEmpty(request.MaterialsName))
            {
                // 資材名称
                query = query.Where(item => item.MATERIALS_NM_KNJ.Contains(request.MaterialsName));
            }

            if (!CheckUtility.IsEmpty(request.Mode))
            {
                if (request.Mode == ConstValue.APPLICATION_FIND_MODE_APPLICATION)
                {
                    // ステータス(公開許可)
                    query = query.Where(item => item.STATUS_NO == ((int)Status.SecretariatPermitPublic).ToString());
                }
                else if (request.Mode == ConstValue.APPLICATION_FIND_MODE_COMMITTEE)
                {
                    // ステータス(受理、審議Ⅰ、Ⅱ、事前審議)
                    query = query.Where(item => new[] {
                        ((int)Status.SecretariatAccept).ToString(),
                        ((int)Status.SecretariatAcceptDiscuss).ToString(),
                        ((int)Status.SecretariatAcceptNoDiscuss).ToString()
                    }.Contains(item.STATUS_NO));
                }
            }

            //ADD:SCSK:20141128:IT指摘事項No.16:START
            string yyyymmdd = DateTime.Now.ToString("yyyyMMdd");
            //ADD:SCSK:20141128:IT指摘事項No.16:END

            List<SearchApplicationResult> results = (from row in query.Where(item => item.DEL_FLG == ‘0‘)
                                                     //MOD:SCSK:20141128:IT指摘事項No.16:START
                                                     //join row_temp in DataContext.TBAARS_COMMITTEE_APPLICATION.AsQueryable().Where(item => item.DEL_FLG == ‘0‘) on row.APPLI_NO equals row_temp.APPLI_NO into row_temp2
                                                     //from committeeApplication in row_temp2.DefaultIfEmpty()
                                                     //MOD:SCSK:20141128:IT指摘事項No.16:END
                                                     join products_temp in productsQuery.Where(item => item.DEL_FLG == ‘0‘) on row.APPLI_NO equals products_temp.APPLI_NO into products_temp2
                                                     from products in products_temp2.DefaultIfEmpty()
                                                     join staffs_temp in DataContext.TBCMRS_STF_INFO on row.APPLICANT_STF_CODE equals staffs_temp.STF_CODE into staffs_temp2
                                                     from staffs in staffs_temp2.DefaultIfEmpty()
                                                     join divisions_tmp in DataContext.TBCMRS_CST_INFO on row.APPLICANT_DIVISION equals divisions_tmp.CST_CODE into divisions_temp2
                                                     from divisions in divisions_temp2.DefaultIfEmpty()
                                                     join drugs_temp in DataContext.TBCMRS_DRUG_INFO.AsQueryable().Where(item => item.DEL_FLG == ‘0‘) on row.DRUG equals drugs_temp.DRUG_CODE into drugs_temp2
                                                     from drugs in drugs_temp2.DefaultIfEmpty()
                                                     join materialsInfo in DataContext.MATERIALS_INFO on row.MATERIALS_CODE equals materialsInfo.MATERIALS_CODE
                                                     join materialsClassInfo in DataContext.MATERIALS_CLASS_INFO on row.MATERIALS_CLASS_CODE equals materialsClassInfo.MATERIALS_CLASS_CODE
                                                     //join materialsattributes_temp in DataContext.MATERIALS_ATTRIBUTES.AsQueryable().Where(item => item.ABOLITION_FLG != "1") on row.MATERIALS_NO equals materialsattributes_temp.MATERIALS_NO into materialsattributes_temp2
                                                     join materialsattributes_temp in DataContext.MATERIALS_ATTRIBUTES on row.MATERIALS_NO equals materialsattributes_temp.MATERIALS_NO into materialsattributes_temp2
                                                     from materialsattributes in materialsattributes_temp2.DefaultIfEmpty()
                                                     //ADD:SCSK:20141128:IT指摘事項No.16:START
                                                     from committeeApplication in DataContext.TBAARS_COMMITTEE_APPLICATION
                                                     //ADD:SCSK:20141128:IT指摘事項No.16:END
                                                     where
                                                     materialsInfo.DEL_FLG == ‘0‘
                                                     && materialsClassInfo.DEL_FLG == ‘0‘
                                                     //ADD:SCSK:20141128:IT指摘事項No.16:START
                                                     && divisions.STA_YMD.CompareTo(yyyymmdd) <= 0
                                                     && divisions.END_YMD.CompareTo(yyyymmdd) >= 0
                                                     && row.APPLI_NO == committeeApplication.APPLI_NO
                                                     && row.REVISION_NO == committeeApplication.REVISION_NO
                                                     && committeeApplication.DEL_FLG == ‘0‘
                                                     //ADD:SCSK:20141128:IT指摘事項No.16:END
                                                     select new SearchApplicationResult()
                                                     {
                                                         ApplicationNo = row.APPLI_NO,
                                                         ApplicantDivisionName = divisions.SCN_NM_KNJ,
                                                         ApplicantStaffName = staffs.STF_NM_KNJ,
                                                         ApplicationDate = row.APPLICATION_DATE,
                                                         DrugName = drugs.DRUG_NM_KNJ,
                                                         MaterialsInfoName = materialsInfo.MATERIALS_NM_KNJ,
                                                         MaterialsClassInfoName = materialsClassInfo.MATERIALS_CLASS_NM_KNJ,
                                                         MaterialsName = row.MATERIALS_NM_KNJ,
                                                         DiscussionClassName = row.DISCUSSION_CLASS.ToString(),
                                                         UniformCode = row.UNIFORM_CODE,
                                                         OrderPartCode = row.ORDER_PART_CODE,
                                                         CommitteeNo = committeeApplication.COMMITTEE_NO,
                                                         CommitteeDelFlg = committeeApplication.DEL_FLG,
                                                         StaffStaYmd = divisions.STA_YMD,
                                                         StaffEndYmd = divisions.END_YMD,
                                                         ApplicationDivRegDate = row.APPLICANT_DIV_REG_DATE,
                                                         AbolitionFlg = materialsattributes.ABOLITION_FLG,
                                                         //ADD:SCSK:20141028:2-3:START
                                                         PurposeBackground = row.PURPOSE_BACKGROUND
                                                         //ADD:SCSK:20141028:2-3:END
                                                     }).Distinct().ToList<SearchApplicationResult>();

            List<SearchApplicationResult> searchResults = new List<SearchApplicationResult>();

            foreach (SearchApplicationResult result in results)
            {
                if (((result.CommitteeNo != null && result.CommitteeDelFlg == ‘0‘) && !request.IsContainSettedCommittee) || result.AbolitionFlg == "1")
                {
                    // 委員会設定済み申請を検索に含めないときで、委員会番号がnull のとき
                    continue;
                }

                if (CheckUtility.IsEmpty(result.ApplicantStaffName)
                    || (!CheckUtility.IsEmpty(result.StaffStaYmd)
                    && (result.StaffStaYmd.CompareTo(result.ApplicationDivRegDate) <= 0
                    && result.StaffEndYmd.CompareTo(result.ApplicationDivRegDate) >= 0)))
                {
                    // 申請者が空文字、もしくは有効な申請者が存在する
                    result.DiscussionClassName = this.GetDiscussionClassName(result.DiscussionClassName);
                    searchResults.Add(result);
                }
            }

            Dictionary<string, object> response = new Dictionary<string, object>();
            response.Add(RESPONSE_KEY_APPLICATION_LIST, searchResults);

            return response;
        }

        /// <summary>
        /// 審議種別コードから審議種別名を朱得する
        /// </summary>
        /// <param name="discussionClassCode"></param>
        /// <returns></returns>
        private string GetDiscussionClassName(string discussionClassCode)
        {
            if (discussionClassCode == "1")
            {
                return "審議Ⅰ";
            }
            else if (discussionClassCode == "2")
            {
                return "審議Ⅱ";
            }
            else if (discussionClassCode == "3")
            {
                return "事前審議";
            }
            else if (discussionClassCode == "0")
            {
                return "未判定";
            }

            return string.Empty;
        }
    }
}

时间: 2024-12-21 03:30:45

linq多表查询的相关文章

Linq多表查询 返回组合实体 踩坑记

新年就不再记流水账了吧,无关紧要的日志太多也不好,有时要找自已记录的一些要点要翻半天 春节假期在家陆陆续续也有在做公司的事,主要是重构,接手的代码看着比较乱,花了很多时间来重构,现在看上去好多了. 使用Linq进行多表查询,要返回各个表的几个组合数据, public class A{ public string NameA{get; set;} } public class B{ public string NameB{get; set;} } 1.原先项目是定义了一个类,里面包含几张表的各个字

LINQ 联表查询 取count 值

linq to sql 实现左外部连接:var query=from a in A join b in B on a.ID equals b.aID into ab from a1 in ab.DefaultIfEmpty() select a1; 然后取query.Count()就行了   因为是延迟查询所以不会多查数据

linq 多表查询

1 var v_Repair = from t_repair in context.T_RPRepair 2 join t_top in context.TopCombine on t_repair.RoadID equals t_top.unique_id 3 join t_user in context.T_wxUser on t_repair.openid equals t_user.openId 4 select new 5 { 6 guid = t_repair.Guid, 7 rpI

Linq 中 表连接查询

1 public void Test(){ 2 3 var query = from a in A join b in B on A.Id equals B.Id into c 4 from d in c.DefaultIfEmpty() 5 select d; 7 } Linq 中 表连接查询,布布扣,bubuko.com

Linq的连表查询

Linq做连表查询,可以先查出A.B表,然后再join A.B表,操作A.B组合的匿名表X var table1=from r in shiti.a() from y in r.years where y>2010 select new { year=y, name=r.FirstName }; var table2=from t in shiti.b() from y in t.years where y>2010 select new { year=y, name=t.name } 然后根

LINQ to DataSet 之单表查询

       查询单个数据表        根据Linq to DataSet概述的步骤, 第一步我们获取数据源,我们这里手动创建一个datatable数据源 static DataSet BuildOneDTDataSet() { string[] nameset = { "张三", "李思思", "lisi", "王五", "路六", "欧赔", "夏琪",&qu

.net Linq多表组合查询结果集

背景: 主流程表中包含员工ID及流程类型ID,在页面查看流程是需要显示员工姓名及流程名称 操作: //先进行分页处理原始数据 var result = from p in _dbContext.Set<BeWorkflowContent>() select p; if (searchWhere != null) result = result.Where(searchWhere); if (order != null) result = result.OrderByDescending(ord

使用Entity Framework Core需要注意的一个全表查询问题

.NET Core 迁移工作如火如荼,今天在使用 Entity Frameowork Core(又名EF Core)时写了下面这样的 LINQ 查询表达式: .Where(u => u.Id == new Guid(userId)).FirstOrDefaultAsync(); 结果在 SQL Server Profiler 中发现竟然进行了全表查询. 之后将 new Guid(userId) 从表达式中移出,保存于一个局部变量中,使用这个局部变量进行查询,全表查询问题就解决了. var use

sql 、linq、lambda 查询语句的区别

LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量中被查询的值 [group by 条件] Lambda表达式的书写格式如下: (参数列表) => 表达式或者语句块 其中: 参数个数:可以有多个参数,一个参数,或者无参数. 参数类型:可以隐式或者显式定义. 表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体). 1.查询全部 实例 Code 查询Student表的所有记录. select *