Entity Framework开发的HRMS 401k报表如何新增D03B数据查询
解决方案
方案1:直接执行原生SQL(推荐,适配你熟悉SQL的技术背景)
你不需要完全掌握EF的查询语法,EF支持直接运行你熟悉的SQL语句,只需替换原有查询逻辑即可:
hrmsEntity hrms = new hrmsEntity(dbConnection); // 直接执行你写的SQL,查询结果会自动映射到TRP_ConDetail对象 var detail = hrms.TRP_ConDetail.SqlQuery(@" SELECT * FROM [SageHRMS_900].[dbo].[UPCHKD] WHERE [EARNDED] IN ('D03', 'D03B') ").ToList(); // 后续循环逻辑不用大幅调整,注意这里遍历的是上方查询得到的detail变量,不要重复查hrms.TRP_ConDetail foreach (var line in detail) { fileData += line.Plan + line.RecordID + line.Date + line.SSN + line.Fund + line.LoanNum + line.Amount + line.Salary + line.SalaryType + line.ContType + line.StateTax + line.LoanPayType + line.Filler01 + Environment.NewLine; }
注意:如果UPCHKD表的字段和TRP_ConDetail类的属性数量、名称不匹配,把SQL里的
*替换为和TRP_ConDetail属性一一对应的字段别名即可。
方案2:使用EF原生Linq查询
如果TRP_ConDetail类中有对应数据库EARNDED字段的属性(大概率是ContType或者Desc字段,你可以找一条已知的D03类型数据,比对属性值确认即可),可以直接用Linq做过滤:
hrmsEntity hrms = new hrmsEntity(dbConnection); // 把代码中的「对应EARNDED的属性名」替换为你确认的实际属性名即可 var detail = hrms.TRP_ConDetail.Where(x => new[]{"D03","D03B"}.Contains(x.对应EARNDED的属性名)).ToList(); foreach (var line in detail) { fileData += line.Plan + line.RecordID + line.Date + line.SSN + line.Fund + line.LoanNum + line.Amount + line.Salary + line.SalaryType + line.ContType + line.StateTax + line.LoanPayType + line.Filler01 + Environment.NewLine; }
原有过滤逻辑排查说明
你没有在现有代码中找到D03的过滤规则,大概率是以下两种情况:
TRP_ConDetail对应的不是数据库物理表,是提前创建的数据库视图,视图中已经写死了WHERE EARNDED = 'D03'的过滤条件,直接修改视图的过滤规则为IN ('D03','D03B')即可,不需要修改任何C#代码- EF配置了全局查询过滤器,你可以搜索项目中
HasQueryFilter相关的代码,找到后把D03B加入过滤条件即可
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

