ASP.NET MVC & EF 构建智能查询 一、智“.NET研究”能查询的需求与设计

简介:   关于复用  在我们日常的开发过程中,代码的复用其实是很重要的一部分,ASP.NET MVC框架本身为我们提供了很多很好的复用机制,让我们能充分地利用它们来节省我们的Coding成本。  在简单的Coding中,我们可以通过构造方法来实现代码段的复用,在OOP编程中我们可以使用继承多态来进行类的复用,我们也可以使用设计模式来做类或对象间的代码设计的复用,随着程序的复杂我们就想构造出更佳的复用方式,可以向更高层次上抽象。

  关于复用

  在我们日常的开发过程中,代码的复用其实是很重要的一部分,ASP.NET MVC框架本身为我们提供了很多很好的复用机制,让我们能充分地利用它们来节省我们的Coding成本。

  在简单的Coding中,我们可以通过构造方法来实现代码段的复用,在OOP编程中我们可以使用继承多态来进行类的复用,我们也可以使用设计模式来做类或对象间的代码设计的复用,随着程序的复杂我们就想构造出更佳的复用方式,可以向更高层次上抽象。

  应用场景与目标

  在信息管理系统中我们会开发大量的List页面,它们功能上通常是非常相似的,一般是包含一个查询条件组和一个列表。

  例如下图所示:

image  那我的目标呢,就是对这里面的查询功能进行封装,以达到“只要更改页面上的条件,就可以实现自动的查询逻辑”这样的功能,即:如果我们要加一个查询条件则不需要修改逻辑代码只修改页面即可。

  其实对于一个有经验的开发人员呢,根据HTML页面的查询条件去自动生成查询结果并不是难事。最简单的是将查询提交表单遍历,然后连接成一个SQL进行查询。

  但是使用SQL有很多问题:

  1. 注入问题,因为不知道类型,所以很多地方都要拼写引号就算是使用Parameter,也无法处理类型转换的问题
  2. 无法处理Or和And共存的问题
  3. 无法处理其它查询条件如大于小于Like

  那我们想一下我们使用EF的话是如何正常去编写一个查询的呢,我们通常是在逻辑中去拼SQL或是写如下的EF:

 
   
var query = db.User.AsQueryable();
if ( string .IsNullOrEmpty(name))
query
= query.Where(c => c.Name == name);
if (id.HasValue)
query
= query.Where(c => c.Id == id);
if ( string .IsNullOrEmpty(email))
query
= query.Where(c => c.Email == email);
return query.ToList();

  那我们的目标其实就明确了,我们就是要让代码自动去完成上述这一过程,并且可以支持:

  1. 识别类型(EF的话这个很重要)
  2. 仅查询有效条件
  3. 处理可空类型
  4. 处理类型转换(如DateTime与UnixTime的转换)
  5. 一些代码性逻辑(比如查询某些日期的时候,其实我们要的结果并不是c=>c.Time==time而是c=>c.Time>time && c.Time<time.AddDays(1))
  6. 支持Or等 混合查询
  7. 关于Like的相关处理
  8. 关于In操作的相关处理
  9. Join查询的相关处理

  理论流程

  看一看我们要做的其实还挺多的,但是我已经在心里搭出了一个这样的流程,使用ASP.NET MVC及EF特性来完成这些功能

image  那其实呢首先的问题就是我们从浏览器请求向服务器的时候,除了要查询的字段,还应该包含有 怎么查(就是操作符,比如= < > like in)、是否为Or、而HTML中唯一可以直接传到服务器的就是表单元素的name所以我们可以对name来做一些手脚上海徐汇企业网站设计与制作让它包含这些信息,比如[Equal]Id就表示让Id这个属性的值等于这个表单上海企业网站设计与制作项的Value。

 
 
[Equal]Id = 1

  我们就利用这个postdata或QueryString去构造出c=>c.Id==1的Lambda表达式,并且支持多个条件。

  实际实现

  而我是在Helper上加了一层扩展来实现这样的功能的,形如:

 
 
< form action ="" method ="post" >
姓名:@Html.TextBox("Name").ForSearch(QueryMetho上海徐汇企业网站制作d.Like)
Email:@Html.TextBox("Email").ForSearch(Que上海闵行企业网站设计与制作ryMethod.Equal)
< br />
Id: @Html.TextBox("Id").ForSearch(QueryMethod.Equal)
生日: @Html.TextBox("Birthday").ForSearch(QueryMethod.Equal)
< br />
< input type ="submit" value ="查询" />
</ form >

  这里我们使用ForSearch这个扩展为Html的name添加了前置的谓词标记[Equal],我们在服务器端只要统一处理:

 
   
public ActionResult Index(QueryModel model)
{
using (var db = new DbEntities())
{
var list 上海企业网站制作an>= db.Users.Where(model).ToList();
return View(list);
}
}

  我们是在这个Where的扩展方法里重写了将QueryModel转换成lambda表达式的工作,当然在这之前我们还利用了自已实现的ModelBinder去将 postdata/querystring进行了分析前初始化了QueryModel。

  在未来的几篇中我们将会详述这些过程的实现:ASP.NET MVC & EF 构建智能查询 二、模型的设计与ModelBinder

目录
相关文章
|
3月前
|
人工智能 缓存 Kubernetes
.NET 9 首个预览版发布:瞄准云原生和智能应用开发
.NET 9 首个预览版发布:瞄准云原生和智能应用开发
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
46 0
|
16天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
22 0
|
2月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
32 0
|
2月前
|
前端开发 Java Spring
Java 新手如何使用Spring MVC 中的查询字符串和查询参数
Java 新手如何使用Spring MVC 中的查询字符串和查询参数
|
2月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
80 0
|
2月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
110 5
|
4月前
|
SQL 开发框架 JavaScript
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
32 0
|
Web App开发 前端开发 .NET
|
9月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
124 0