使用EF+Linq或Sql存储过程获取报表数据优缺点分析|C/S开发框架

使用EF+Linq或Sql存储过程获取报表数据优缺点分析
前言
本文讲解使用EF+Linq或Sql存储过程获取报表数据优缺点分析。
下面以员工档案报表举例说明。
EFCore+Linq查询
优点:无数据迁移相关问题(无Sql脚本,无存储过程)
缺点:查询算法程序硬编码,当报表增删字段,需要重新发布版本才能使用。
C# 全选
var q1 = _Database.GetQueryable<dt_Employee>();
var q2 = _Database.GetQueryable<dt_EmployeeContract>();
var q3 = _Database.GetQueryable<dt_EmployeePositionAdjustment>();
var qTmp = (from a in q1
join b in q2 on a.InfoID equals b.InfoID into tmp1
from b in tmp1.DefaultIfEmpty()
join c in q3 on a.InfoID equals c.InfoID into tmp2
from c in tmp2.DefaultIfEmpty()
where a.InfoID == input.InfoID
select new res_EmployeeReport
{
isid = a.isid,
InfoID = a.InfoID,
Birthday = a.Birthday,
CID = a.CID,
CodeID = a.CodeID,
CreatedBy = a.CreatedBy,
CreationDate = a.CreationDate,
DeptCode = a.DeptCode,
Nation = a.Nation,
Native = a.Native,
NativeAddress = a.NativeAddress,
Phone = a.Phone,
UIDExpire = a.UIDExpire,
UIDValid = a.UIDValid,
AppLoginPwd = a.AppLoginPwd,
Education = a.Education,
EmpName = a.EmpName,
EntryFactoryDate = a.EntryFactoryDate,
FlagAppLogin = a.FlagAppLogin,
FlagSales = a.FlagSales,
HealthStatus = a.HealthStatus,
IntroduceName = a.IntroduceName,
IsMarry = a.IsMarry,
JobId = a.JobId,
KitasID = a.KitasID,
LastUpdateDate = a.LastUpdateDate,
LastUpdatedBy = a.LastUpdatedBy,
NowAddress = a.NowAddress,
PID = a.PID,
PositionId = a.PositionId,
ProcessId = a.ProcessId,
Relation = a.Relation,
Remark = a.Remark,
Sex = a.Sex,
Speciality = a.Speciality,
UID = a.UID,
ContractNo = b == null ? "" : b.ContractNo,
ValidateDateBegin = b == null ? null : b.ValidateDateBegin,
ValidateDateEnd = b == null ? null : b.ValidateDateEnd,
DeptAfter = c == null ? "" : c.DeptAfter,
Ages = 0,
WorkYears = 0,
});
var listM = qTmp.ToList();
//计算工龄和年龄
listM.ForEach(item =>
{
item.WorkYears = ((DateTime.Today - item.EntryFactoryDate)?.TotalDays / 365d).ToInt();
item.Ages = ((DateTime.Today - item.Birthday)?.TotalDays / 365d).ToInt();
});
var listD = q2.Where(w => w.InfoID == input.InfoID).ToList();
ds.Tables.Add(listM.ToDataTable());
ds.Tables.Add(listD.ToDataTable());Sql 存储过程
优点:将查询算法写到存储过程,C#代码与Sql代码分离,代码可读性好。当报表增删字段,只需要更改存储过程,不需要发布版本。
缺点:数据库迁移相当麻烦,需要重新编写不同数据库的存储过程。
C#,调用存储过程:
C# 全选
var pInfoID = _Database.CreateParameter("InfoID", input.InfoID);
ds = _Database.GetDataSet("usp_EmployeeQueryReportData", CommandType.StoredProcedure, pInfoID);Sql存储过程
SQL 全选
ALTER PROCEDURE [dbo].[usp_EmployeeQueryReportData]
@InfoID varchar(50)
AS
BEGIN
/**********************************************************************
* 查询员工资料
* --------------------------------------------------------------------
修改记录:
2023/08/29 : 创建
--------------------------------------------------------------------
SELECT * FROM dt_EmployeE
SELECT * FROM dt_EmployeePositionAdjustment
EXEC [usp_EmployeeQueryReportData] '8001';
*********************************************************************/
--返回员工表
SELECT TOP 1 e.*,
ec.ContractNo,ec.ValidateDateBegin,ec.ValidateDateEnd,
epa.DeptAfter,--最新部门
Ages=DATEDIFF(YY,e.Birthday,GETDATE()), --年龄
WorkYears=DATEDIFF(YY,e.EntryFactoryDate,GETDATE()) --连续工龄
FROM dt_Employee e
left join dt_EmployeeContract ec on e.InfoID=ec.InfoID
left join dt_EmployeePositionAdjustment epa on e.InfoID=epa.InfoID
WHERE e.InfoID = @InfoID
ORDER BY ec.CreationDate,epa.CreationDate DESC
--返回员工合同表
SELECT * FROM dt_EmployeeContract WHERE InfoID=@InfoID ORDER BY CreationDate DESC
END员工档案报表


参考文档:
EFCore+LINQ 使用DebugView查看LINQ转译后的原生SQL|C/S开发框架
Winform开发框架 - 使用Linq判断日期时间范围查询条件的方法
C# LINQ基础-Linq基本使用方法-C/S开发框架
C# LINQ使用案例参考-C/S开发框架
C#使用SqlBulkCopy快速导入Excel文件(xls/xlsx)-C/S开发框架
使用.NET8/EFCore访问达梦数据库|C/S框架网|C/S开发框架
C# EF+LINQ 高性能Like语法|C/S开发框架
EFCore+Linq高效批量删除包含图片及大文本的数据两种性能对比|C/S开发框架
.NET5 Core 关于LINQ查询使用DateDiff解决方案|C/S开发框架
CSFramework.EF.PostgreSql数据库组件 PostgreSql数据库测试报告|C/S开发框架
CSFrameworkV6快速开发框架 | 使用PostgreSql 数据库测试报告|C/S开发框架
C# EF+LINQ 查询主表明细表数据查询条件写法|C/S开发框架
SQLSERVER:误删Windows登录用户而sa禁用,导致无法使用Windows身份验证解决方案|C/S开发框架
FastReport.NET 2023使用DataTable报表数据源配置MsSqlDataConnection连接|C/S开发框架
EFCore+.NET8:使用Oracle数据库提交大图片文件需要指定BLOB类型|C/S开发框架
.NETCore使用EF保存图片报错:OracleExceptiol: ORA|01460:转换请求无法实施或不合理|C/S开发框架
EFCore+LINQ 使用DebugView查看LINQ转译后的原生SQL|C/S开发框架
Winform开发框架 - 使用Linq判断日期时间范围查询条件的方法
C# LINQ基础-Linq基本使用方法-C/S开发框架
C# LINQ使用案例参考-C/S开发框架
C#使用SqlBulkCopy快速导入Excel文件(xls/xlsx)-C/S开发框架
使用.NET8/EFCore访问达梦数据库|C/S框架网|C/S开发框架
C# EF+LINQ 高性能Like语法|C/S开发框架
EFCore+Linq高效批量删除包含图片及大文本的数据两种性能对比|C/S开发框架
.NET5 Core 关于LINQ查询使用DateDiff解决方案|C/S开发框架
CSFramework.EF.PostgreSql数据库组件 PostgreSql数据库测试报告|C/S开发框架
CSFrameworkV6快速开发框架 | 使用PostgreSql 数据库测试报告|C/S开发框架
C# EF+LINQ 查询主表明细表数据查询条件写法|C/S开发框架
SQLSERVER:误删Windows登录用户而sa禁用,导致无法使用Windows身份验证解决方案|C/S开发框架
FastReport.NET 2023使用DataTable报表数据源配置MsSqlDataConnection连接|C/S开发框架
EFCore+.NET8:使用Oracle数据库提交大图片文件需要指定BLOB类型|C/S开发框架
.NETCore使用EF保存图片报错:OracleExceptiol: ORA|01460:转换请求无法实施或不合理|C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
