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月前
|
设计模式 前端开发 数据库
深入理解MVC设计模式:构建高效Web应用程序的基石
【7月更文挑战第4天】在软件工程领域,设计模式是解决常见问题的一系列经过验证的方法。其中,Model-View-Controller(MVC)设计模式自诞生以来,便成为了构建用户界面,特别是Web应用程序的黄金标准。MVC通过将应用程序逻辑分离为三个核心组件,提高了代码的可维护性、可扩展性和重用性。本文将深入探讨MVC设计模式的原理,并通过一个简单的代码示例展示其应用。
71 0
|
5月前
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
328 3
|
1月前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
54 7
|
2月前
|
开发框架 前端开发 算法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
|
2月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
|
2月前
|
SQL Oracle 关系型数据库
.NET 开源快捷的数据库文档查询和生成工具
【8月更文挑战第1天】推荐几款.NET开源数据库文档工具:1. DBDocumentor,支持多类型数据库,快速生成详尽文档;2. SqlDoc,界面简洁,自定义内容与格式;3. DBInfo,强大查询功能,支持多种导出格式。这些工具有效提升文档管理效率与质量。
|
3月前
|
C#
效率提升利器:一个在线的.NET源码查询网站
效率提升利器:一个在线的.NET源码查询网站
|
4月前
|
机器学习/深度学习 JSON 测试技术
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
122 0
|
5月前
|
前端开发 JavaScript 开发者
深入理解MVC和MVVM:构建现代Web应用的利器
深入理解MVC和MVVM:构建现代Web应用的利器
|
5月前
|
机器学习/深度学习 算法 数据可视化
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究