.Net Core 使用Entity Framework Core中实现Expression<Func<T,out TResult>>的动态条件查询
一,应用环境
系统环境:Windows 10
.Net Core: 2.2.0
Entity Framework Core: 2.2.0
数据库:SQL Server 2014
二,背景
最近在学习Asp.Net Core的使用,牵涉到数据访问这块的内容就使用了EntityFrameworkCore作为实现,在数据访问层中写了基类来做查询使用。
在基础查询中使用了 Expression<Func<T,out TResult>> 作为通行查询条件参数,简单实现都没有问题速度上也挺快,但是恶心的(技术不行)事情发生了,在实际的应用过程中会有很多需要根据用户输入的查询条件来动态的拼接查询条件的问题。该参数( Expression<Func<T,out TResult>> )就不知道如何动态实现不同的查询条件了。
于是开启了各种网络查询与咨询大神的过程,发现不少人都没有用过这种实现(可能是通过拼接SQL或者存储过程实现了)。但最终还是找到了一种实现方式,经测试完全可行,好接下来先上代码。此处用到了一个额外的第三方库实现LINQKit
三,示例代码
1 public List<RdrPatientInfo> GetRdrPatientInfos(string patientName, string SSN, string empiId, string visitNumber) 2 { 3 var whereLambda = PredicateBuilder.New<RdrPatientInfo>(); 4 if (!string.IsNullOrWhiteSpace(patientName)) 5 whereLambda = whereLambda.And(p => p.PatientName.Contains(patientName)); 6 if (!string.IsNullOrWhiteSpace(SSN)) 7 whereLambda = whereLambda.And(p => p.Idnumber.Contains(SSN)); 8 if (!string.IsNullOrWhiteSpace(empiId)) 9 whereLambda = whereLambda.And(p => p.EmpiId.Contains(empiId)); 10 11 return _rdrPatientInfoRepository.LoadEntities(whereLambda).ToList(); 12 13 }
其中 PredicateBuilder 是LinqKit库的支持,通过上述的方法就可以组合出一个动态的 Expression<Func<T,out TResult>> 集合。
文章中可能出现错误之处,若有发现请留言指正,不胜感激。
浙公网安备 33010602011771号