当前位置: 首页 > 编程语言 > C#

如何动态构建实体框架查询?分享

时间:2023-04-10 23:42:10 C#

如何动态构建实体框架查询?我是EntityFramework的新手,我对过滤数据有疑问。我有两个不同的日志实体:DiskLog和NetworkLog。这些实体派生自日志实体。这是我的C#应用程序中的一些代码:publicclassLog{...}publicclassDiskLog:Log{...}publicclassNetworkLog:Log{...}publicenumLogType{NotInitialized=0,Disk,Network}publicListGetWithFilter(GuiduserKey,intnSkip,intnTake,DateTimedateFrom=DateTime.MinValue,DateTimedateTo=DateTime.MaxValue,LogTypelogType=LogType.NotInitialized,intcomputerId=0){//需要知道如何优化...return...}当然,我已经创建了一个工作应用程序和数据库表。我要做的是让函数GetWithFilter工作。我有几种方法:iflogType==LogType.Disk&&computerId<=0(意味着查询中不需要computerId参数,只选择DiskLog实体)iflogType==LogType.Disk&&computerId>0(意味着我必须使用computerId参数,仅选择DiskLog实体)如果logType==LogType.NotInitialized&&computerId<=0(无需使用computerId和logType,只需选择所有实体,DiskLog和NetworkLog)如果logType==LogType。NotInitialized&&computerId>0(选择指定计算机的所有日志类型)iflogType==LogType.Network&&computerId<=0(选择所有NetworkLog实体)iflogType==LogType.Network&&computerId>0(选择所有NetworkLog实体)如您所见,有很多选项可用。我有6个这样的查询要写:1.context.LogSet.OfType.Where(x=>x.Computer.User.UserKey==userKey).Where(x=>x.DateStamp>=dateFrom&&x.DateStampx.Id).Skip(nSkip).Take(nTake).ToList();2.context.LogSet.OfType.Where(x=>x.Computer.User.UserKey==userKey).Where(x=>x.DateStamp>=dateFrom&&x.DateStampx.Computer.Id==computerId).OrderByDescending(x=>x.Id).Skip(nSkip).Take(nTake).ToList();3。context.LogSet.Where(x=>x.Computer.User.UserKey==userKey).Where(x=>x.DateStamp>=dateFrom&&x.DateStampx.Id).Skip(nSkip).Take(nTake).ToList();//最简单的一个!4。context.LogSet.Where(x=>x.Computer.User.UserKey==userKey).Where(x=>x.DateStamp>=dateFrom&&x.DateStampx.Computer.Id==computerId).OrderByDescending(x=>x.Id).Skip(nSkip).Take(nTake).ToList();5.context.LogSet.OfType.Where(x=>x.Computer.User.UserKey==userKey).Where(x=>x.DateStamp>=dateFrom&&x.DateStampx.Id).Skip(nSkip).采取(nTake).ToList();6。context.LogSet.OfType.Where(x=>x.Computer.User.UserKey==userKey).Where(x=>x.DateStamp>=dateFrom&&x.DateStampx.Computer.Id==computerId).OrderByDescending(x=>x.Id).Skip(nSkip).Take(nTake).ToList();那么问题是如何优化代码呢?如何让它变得更好。您可以轻松地使用查询组合。首先从查询开始。IQueryablequery=context.LogSet;它们形成子查询。如果(logType==LogType.Disk){query=query.OfType();//不确定这里是否需要转换}elseif(logType==LogType.Network){query=query.OfType();//不确定这里是否需要转换}query=query.Where(x=>x.Computer.User.UserKey==userKey);如果(computerId!=0)query=query.Where(x=>x.Computer.Id==computerId);//..等等query=query.OrderByDescending(x=>x.Id).Skip(nSkip).Take(nTake);返回查询.ToList();//进行数据库调用,具体化数据并返回;我建议在没有值的情况下使用可空类型。您可以使用FuncIEnumerableSelect(IEnumerablesource,FuncuserKeyFunc,FuncdateFunc,intskip,inttake){returnsource.OfType().Where(userKeyFunc).Where(dateFunc).Skip(skip).Take(拿);然后使用:varresult=Select(context.LogSet,x=>x.Computer.User.UserKey==userKey,x=>x.DateStamp>=dateFrom&&x.DateStamp你可以为这个函数创建工厂上面是C#学习教程:如何动态构造实体框架查询?所有内容分享,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自互联网,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载,请注明出处: