前言:

1.为什么要封装lambda表达式数据库查询,原因有一下几点:

1.1.在以往的开发中进行数据库表查询时,其实所需要的字段就是其中几个,但是在开发中,开发者往往习惯select * 进行查询,当数据多和用户量多时,查询的效率会降低。

1.2.在写查询where条件的时候,总是用string.format去拼接字符串,开发效率低。

1.3.代码不够优雅,代码中嵌套和多sql语句,如果是表字段发生改变时编译器检查不出来,代码出错的概率大。

1.4.本着 write less  do more 原则

2.代码展示和类结构:

文件目录:

分析:

设计的思路是模仿数据库的查询语句,如: select a,b..... from tab  where  a=‘’  Order by a  基本结构写,其中help是解析lambda表达式,获取到对应字段的名称。

opreationclass中看文件的名称就可以很好的区分,DbSelect 中可以获取到要查询的字段和Operationwhere的对象并把查询字段值赋值给operationwhere属性字段,

operationwhere 可以获取大查询的条件字符串,在把查询字段和查询条件字符串传递给oprationExcute 进行查询返回结果集(也可以传给oprationOderby,在传递给oprationExcute ),oprationExcute是执行返回数据集结果,在把结果集传给TransformationData进行list和datatable,json的转换。

源代码:

1.GetClomun:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace GTJ.Core.Select.Helpers
{
public class GetClomun
{
/// <summary>
/// [Display(Name = "")]
/// 获得类属性中标记的名称
/// </summary>
/// <param name="expr"></param>
/// <returns></returns>
public static string GetDisplayName(Expression expr)
{
var memberParam = expr as MemberExpression;
if (memberParam != null)
{
return GetDisplayName(memberParam);
}
var unary = expr as UnaryExpression;
if (unary != null)
{
return GetDisplayName(unary.Operand as MemberExpression);
}
var call = expr as MethodCallExpression;
if (call != null)
{
return GetDisplayName(call.Object as MemberExpression);
}

return string.Empty;

}

/// <summary>
/// [Display(Name = "记住帐号")]
/// 获得类属性中标记的中文名
/// </summary>
/// <param name="memberParam"></param>
/// <returns></returns>
private static string GetDisplayName(MemberExpression memberParam)
{
var name = memberParam.Member.Name;
var property = memberParam.Member.ReflectedType.GetProperty(name);
var displays = property.GetCustomAttributes(typeof(DisplayAttribute), false);
if (displays == null || displays.Length == 0)
return property.Name;
else
return (displays[0] as DisplayAttribute).Name;
}
}
}

2.OprationExcute

using CYQ.Data;
using CYQ.Data.Table;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GTJ.Core.Select.OperationClass
{
public class OprationExcute<T> where T:new()
{
/// <summary>
/// 要显示的列
/// </summary>
public List<string> column = new List<string>();
/// <summary>
/// 查询字符串
/// </summary>
public string WhereStr = null;
/// <summary>
/// 排序字符串
/// </summary>
public string OderByStr = null;
/// <summary>
/// 执行显示的条数
/// </summary>
/// <param name="top"></param>
/// <returns></returns>
public TransformationData<T> Excute(string top)
{
if (this.OderByStr == null)
{
this.OderByStr = "CreateTime desc";
}
TransformationData<T> Data = new TransformationData<T>();
Data.Table= GetMDataTable(this.column.ToArray(), top, this.WhereStr+ " order by " + this.OderByStr,null);
return Data;
}

private MDataTable GetMDataTable(string[] arr = null, string top = null, string where = null, string name = null)
{
if (name == null)
{
name = new T().ToString();
}
using (MAction action = new MAction(name))
{
if (arr != null)
{
var columnStr = "";
for (var i = 0; i < arr.Length; i++)
{
columnStr += arr[i].ToString();
columnStr += ",";
}
columnStr = columnStr.TrimEnd(',');
action.SetSelectColumns(columnStr);
}
if (where != null && top != null)
{
return action.Select(Convert.ToInt32(top), where);

}
else if (where == null && top != null)
{
return action.Select(Convert.ToInt32(top));
}
else if (where != null && top == null)
{
return action.Select(where);
}
else
{
return action.Select();
}
}
}
}
}

3.OprationFindModel

using CYQ.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace GTJ.Core.Select.OperationClass
{
public class OprationFindModel<T> where T:new()
{
/// <summary>
/// 查询model情况
/// </summary>
/// <param name="funcs"></param>
public T FindModel(params Expression<Func<T, bool>>[] funcs)
{
GTJ.Core.AiExpConditions<T> exp = new AiExpConditions<T>();

for(var i = 0; i < funcs.Length; i++)
{
exp.AddAndWhere(funcs[i]);
}

return GetModelData(exp.Where(false));
}

private T GetModelData(string where, string name = null)
{
try
{
if (name == null)
{
name = new T().ToString();
}
using (MAction action = new MAction(name))
{
if (action.Fill(where))
{
return action.Data.ToEntity<T>();
}
else
{
return new T();
}
}

}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
}
}

4.OprationOderByDesc

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace GTJ.Core.Select.OperationClass
{
public class OprationOderByDesc<T> where T:new ()
{
/// <summary>
/// 要显示的列
/// </summary>
public List<string> column = new List<string>();
/// <summary>
/// 查询字符串
/// </summary>
public string WhereStr = null;
public OprationExcute<T> OderByDesc(bool result,params Expression<Func<T,string>>[] funcs)
{
List<string> OderBy = new List<string>();
OprationExcute<T> excute = new OprationExcute<T>();
for (var i = 0; i < funcs.Length; i++)
{
OderBy.Add(Helpers.GetClomun.GetDisplayName(funcs[i].Body));
}
excute.OderByStr = string.Join(",", OderBy.ToArray());
if (result == true)
{
excute.OderByStr += " desc";
}
else
{
excute.OderByStr += " asc";
}
excute.column = this.column;
excute.WhereStr = this.WhereStr;
return excute;
}
}
}

5.OprationWhere

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace GTJ.Core.Select.OperationClass
{
public class OprationWhere<T> where T:new()
{
/// <summary>
/// 要显示的列
/// </summary>
public List<string> column = new List<string>();

/// <summary>
/// 查询条件
/// </summary>
/// <param name="funcs"></param>
/// <returns></returns>
public OprationExcute<T> Where(params Expression<Func<T, bool>>[] funcs)
{
OprationExcute<T> Excute = new OprationExcute<T>();
GTJ.Core.AiExpConditions<T> exp = new AiExpConditions<T>();
for(var i = 0; i < funcs.Length; i++)
{
exp.AddAndWhere(funcs[i]);
}
Excute.WhereStr = exp.Where(false);
Excute.column = this.column;
return Excute;
}

public OprationOderByDesc<T> Where(bool resutl ,params Expression<Func<T, bool>>[] funcs)
{
OprationOderByDesc<T> OderBy = new OprationOderByDesc<T>();
GTJ.Core.AiExpConditions<T> exp = new AiExpConditions<T>();
for (var i = 0; i < funcs.Length; i++)
{
exp.AddAndWhere(funcs[i]);
}
OderBy.WhereStr = exp.Where(false);
OderBy.column = this.column;

return OderBy;
}
}
}

6.TransformationData

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CYQ.Data.Table;
using CYQ.Data;

namespace GTJ.Core.Select.OperationClass
{
public class TransformationData<T> where T : new ()
{

public MDataTable Table = new MDataTable();
/// <summary>
/// 转成list
/// </summary>
public List<T> ToList()
{
return Table.ToList<T>();
}

public DataTable ToDataTable()
{
return Table.ToDataTable();
}

public string ToJson()
{
return Table.ToJson();
}
}
}

7.DbSelect

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

/// <summary>
/// zouhp 2017.6.16 V1
/// lambda 快速进行单表查询
/// </summary>
namespace GTJ.Core.Select
{
/// <summary>
/// lambda快速查询
/// </summary>
/// <typeparam name="T"></typeparam>
public class DbSelect<T> where T:new()
{
public OperationClass.OprationWhere<T> Select(params Expression<Func<T,string>>[] funcs)
{
OperationClass.OprationWhere<T> where = new OperationClass.OprationWhere<T>();
for (var i = 0; i < funcs.Length; i++)
{
where.column.Add(Helpers.GetClomun.GetDisplayName(funcs[i].Body));
}
return where;
}

public T Select(params Expression<Func<T, bool>>[] funcs)
{
OperationClass.OprationFindModel<T> Model = new OperationClass.OprationFindModel<T>();
return Model.FindModel(funcs);
}
}
}

转载于:https://www.cnblogs.com/zouhp/p/7192258.html

lambda表达式封装对数据库的查询相关推荐

  1. lambda表达式最全总结

    lambda表达式 一.lambda表达式的引入 为什么引入lambda表达式 需求环境:线程类的创建 解决方案:匿名内部类实现 解决方案PLUS:lambda表达式实现 代码: package co ...

  2. 简化业务代码开发:看Lambda表达式如何将代码封装为数据

    摘要:在云服务业务开发中,善于使用代码新特性,往往能让开发效率大大提升,这里简单介绍下lambad表达式及函数式接口特性. 1.Lambda 表达式 Lambda表达式也被称为箭头函数.匿名函数.闭包 ...

  3. 将C#Lambda表达式转换为通用过滤器描述符和HTTP查询字符串

    目录 介绍 背景 一般而言,什么是表达式?条件表达式与它们有什么不同? ExpressionVistor如何工作 整体情况 解决方案 基础 必要的表达式修改 修改布尔MemberAccess表达式 修 ...

  4. mysql select表达式_MySQL数据库SELECT查询表达式解析

    数据的管理在很大一部分是在进行查找工作,而SELECT占据了很大的一部分 SELECT select_expr [,select_expr...] [ FROM table_reference WHE ...

  5. [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询

    此文章非原创,转载自诗人江湖老,原文地址 在Git上下载源码 在工程中我们少不了要定义类或者结构去储存数据,这些数据将被临时地储存在内存中,现在我们想要对其完成一些类似于查找.过滤等等常见的任务的时候 ...

  6. 动态创建Lambda表达式实现高级查询

    需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...

  7. 函数式编程-Stream流/lambda表达式/Optional/函数式接口/方法引用/高级用法

    函数式编程-Stream流 不会Lambda表达式.函数式编程?你确定能看懂公司代码?-java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通-最通俗易懂 1. 概述 ...

  8. LINQ(隐式表达式、lambda 表达式)

    .NET 中一项突破性的创新是 LINQ( Language Integrated Query,语言集成查询),这组语言扩展让你能够不必离开舒适的 C# 语言执行查询. LINQ 定义了用于构建查询表 ...

  9. jdk8新特性 lambda表达式详解

    本文主要讲到的内容有: 一- 前言 二- 背景 三- lambda表达式的语法 四- Lambda程序例子 4-1 Runnable Lambda 4-2 Comparator Lambda 4-3 ...

最新文章

  1. 未能加载文件或程序集“Report.Basic”或它的某一个依赖项。试图加载格式不正确的程序...
  2. android enum java包_Android @IntDef注解取代Java enum枚举提高性能详解
  3. 最流行的python爬虫框架_Python最火爬虫框架Scrapy入门与实践
  4. oracle表空间 设置,Oracle表空间怎么设置和管理
  5. Angularjs切换网站配色模式简单示例1(切换css文件)
  6. HTML5 文档头部
  7. Jquery常用方法合集,超实用
  8. 霍尔电流传感器ACS712/CH701在电动方向盘电机驱动控制器的应用
  9. xml文件简介(上)
  10. [网络安全自学篇] 七十六.逆向分析之OllyDbg动态调试工具(二)INT3断点、反调试、硬件断点与内存断点
  11. 一文了解滴滴与蚂蚁金服开源共建的SQLFlow
  12. D3 天眼查 股权结构图
  13. CAD文字显示号问题原因和解决办法
  14. 全国省份地区相关常量备忘
  15. 人家好害羞啦主题主题下载
  16. 单片机驱动DM542步进电机(使丝杠做往返运动--速度可调)
  17. java反射进行字段类型判断_Java反射机制的讲解
  18. android中用代码实现禁止页面旋转,Android通过代码禁止屏幕旋转
  19. Windows XP Embedded (XPE)开发工具、升级包、中文包等微软官方下载地址
  20. HDU1846(博弈论,Brave Game)

热门文章

  1. 新突破!Swin-UNet:基于纯 Transformer 结构的医学图像分割网络
  2. 2020年还需要阅读的10篇人工智能论文
  3. 重磅!浙大博士两破世界纪录,三年两获浙大竺可桢奖学金!
  4. Magento用的哪个php框架,初识magento框架代码目录
  5. 近6年语音合成领域都有哪些论文?
  6. 基于注意力机制的seq2seq网络
  7. CNN看清世界——浅谈四个经典网络的差异
  8. Hybrid A*论文解析(3)
  9. 地理学中常见图的名称(或者分析)
  10. java怎么指定父窗口大小_[Java教程]jQuery如何获取div距离窗口顶部或者父元素顶部的距离...