实体类调用泛型父类中的静态方法中执行CRUD——第二版
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq; namespace WebHub {
public abstract class HubContext<DB, T>
where DB : DbContext, new()
where T : class {
public static void Remove(object idOrObj) {
using (var db = new DB()) {
if (idOrObj.GetType() == typeof(T)) {
db.Set<T>().Remove(idOrObj as T);
db.SaveChanges();
} else {
var t = db.Set<T>().Find(idOrObj);
db.Set<T>().Remove(t);
db.SaveChanges();
}
}
}
public static T Add(T t) {
using (var db = new DB()) {
db.Set<T>().Add(t);
db.SaveChanges();
return t;
}
}
public static T Add(T t, Action failCallback) {
using (var db = new DB()) {
db.Set<T>().Add(t);
try {
db.SaveChanges();
} catch (Exception) {
failCallback();
return default(T);
}
return t;
}
}
public static TR Execute<TR>(object id, Func<T, TR> func) {
var props = typeof(T).GetProperties();
using (var db = new DB()) {
var t = db.Set<T>().Find(id);
if (t == null) {
return default(TR);
}//TODO:if no "ToList()" below, won't work.WHY?
var oldValues = props.Select(p => p.GetValue(t, null) ?? string.Empty).ToList();
TR r;
try {
r = func(t);
} catch {
return default(TR);
}
var newValues = props.Select(p => p.GetValue(t, null) ?? string.Empty).ToList(); for (int i = ; i < props.Count(); i++) {
if (newValues[i].GetHashCode() != oldValues[i].GetHashCode()) {
db.SaveChanges();
}
}
return r;
}
} public static int Execute(object id, Action<T> action) {
var props = typeof(T).GetProperties();
using (var db = new DB()) {
var t = db.Set<T>().Find(id);
if (t == null) {
return ;
}
var oldValues = props.Select(p => p.GetValue(t, null) ?? string.Empty).ToList();
try {
action(t);
} catch {
return ;
}
var newValues = props.Select(p => p.GetValue(t, null) ?? string.Empty).ToList();
for (int i = ; i < props.Count(); i++) {
if (newValues[i].GetHashCode() != oldValues[i].GetHashCode()) {
var r = db.SaveChanges();
return r;
}
}
return ;
}
}
public static T First() {
using (var db = new DB()) {
var r = db.Set<T>().FirstOrDefault();
return r;
}
}
public static T First(object id) {
using (var db = new DB()) {
return db.Set<T>().Find(id);
}
}
public static T First(Func<T, bool> predicate) {
using (var db = new DB()) {
var r = db.Set<T>().FirstOrDefault(predicate);
return r;
}
}
public static T First<P>(Func<T, bool> predicate, Func<T, P> orderby) {
var r = First(predicate, orderby, false);
return r;
}
public static T First<P>(Func<T, bool> predicate, Func<T, P> orderby, bool desc) {
using (var db = new DB()) {
T r;
if (desc) {
r = db.Set<T>().Where(predicate).OrderByDescending(orderby).FirstOrDefault();
} else {
r = db.Set<T>().Where(predicate).OrderBy(orderby).FirstOrDefault();
}
return r;
}
}
public static int Count() {
using (var db = new DB()) {
return db.Set<T>().Count();
}
}
public static int Count(Func<T, bool> prediacate) {
using (var db = new DB()) {
return db.Set<T>().Count(prediacate);
}
}
public static IEnumerable<T> All() {
using (var db = new DB()) {
var r = db.Set<T>().ToList();
return r;
}
}
public static bool Exists(object id) {
using (var db = new DB()) {
var r = db.Set<T>().Find(id);
return r != null;
}
}
public static bool Exists(Func<T, bool> where) {
using (var db = new DB()) {
var r = db.Set<T>().Any(where);
return r;
}
}
public static IEnumerable<T> Find(Func<T, bool> where) {
using (var db = new DB()) {
var rr = db.Set<T>().Where(where).ToList();
return rr;
}
}
public static IEnumerable<T> Find<P>(Func<T, bool> where, Func<T, P> orderby) {
using (var db = new DB()) {
var r = db.Set<T>().Where(where).OrderBy(orderby).ToList();
return r;
}
}
public static IEnumerable<T> Find(Func<T, bool> where, int skip, int take) {
using (var db = new DB()) {
return db.Set<T>().Where(where).Skip(skip).Take(take).ToList();
}
}
public static IEnumerable<T> Find(Func<T, bool> where, int skip, int take, out int all) {
using (var db = new DB()) {
all = db.Set<T>().Count(where);
return db.Set<T>().Where(where).Skip(skip).Take(take).ToList();
}
}
public static IEnumerable<T> Find<P>(Func<T, bool> where, Func<T, P> orderby, int skip, int take) {
using (var db = new DB()) {
var r = db.Set<T>().Where(where).OrderBy(orderby).Skip(skip).Take(take).ToList();
return r;
}
}
public static IEnumerable<T> Find<P>(Func<T, bool> where, Func<T, P> orderby, int skip, int take, out int all) {
using (var db = new DB()) {
all = db.Set<T>().Count(where);
var r = db.Set<T>().Where(where).OrderBy(orderby).Skip(skip).Take(take).ToList();
return r;
}
}
public static IEnumerable<T> Find<P>(Func<T, bool> where, Func<T, P> orderby, DataPager p) {
using (var db = new DB()) {
p.Total = db.Set<T>().Count(where);
var r = db.Set<T>().Where(where).OrderBy(orderby).Skip(p.Current * p.Size).Take(p.Size).ToList();
return r;
}
}
}
}
实体类调用泛型父类中的静态方法中执行CRUD——第二版的更多相关文章
- mybatis-plus代码生成,实体类不生成父类属性
一.参考文档: 官方文档其实说的很清楚了,可能有个别地方有点不太清楚. mybatis-plus官方: https://mp.baomidou.com/guide/generator.html 模版引 ...
- DataTable填补了实体类返回泛型集合
坤哥见我昨天找了一段代码,如下面: 略微解释下,这段代码时D层查询结束后,将datatable查询到的结果赋值给实体对象的属性,然后返回实体的过程.坤哥看了之后问我,假设实体有500多个属性,难道也要 ...
- DataTable填充实体类返回泛型集合
昨天找坤哥看到我的一段代码.例如以下: 略微解释下,这段代码时D层查询结束后,将datatable查询到的结果赋值给实体对象的属性,然后返回实体的过程.坤哥看了之后问我.假设实体有500多个属性.难道 ...
- 利用FastJson,拼接复杂嵌套json数据&&直接从json字符串中(不依赖实体类)解析出键值对
1.拼接复杂嵌套json FastJson工具包中有两主要的类: JSONObject和JSONArray ,前者表示json对象,后者表示json数组.他们两者都能添加Object类型的对象,但是J ...
- spring boot JPA中实体类常用注解
spring boot jpa中的注解很多,参数也比较多.没必要全部记住,但是经常查看官方文档也比较麻烦,记录一下一些常用的注解.通过一些具体的例子来帮助记忆. @Entity @Table(name ...
- KO ------- 表中字段名和实体类属性名不一致
-----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就 ...
- mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_智能标签
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...
- Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突
原文链接:http://www.cnblogs.com/xdp-gacl/p/4264301.html http://www.cnblogs.com/xdp-gacl/p/4264425.ht ...
- Hibernate第二天——实体类 与缓存机制
第二天,我们先来了解一下框架里的一个重要概念:实体类 实体类:把数据表或其它持久化数据的格式映射成的类,就是实体类. 实体类的编写规则:由于对应的是javabean,因而也遵循javabean的一些规 ...
随机推荐
- mysql中engine=innodb和engine=myisam的区别
最开始用MySQL Administrator建数据库的时候,表缺省是InnoDB类型,也就没有在意.后来用Access2MySQL导数据的时候发现只能导成 MyISAM类型的表,不知道这两种类型有什 ...
- JSON风格指南-真经
简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语 ...
- RDIFramework.NET 中多表关联查询分页实例
RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为 ...
- Scala 流程空间,函数,异常处理
1,)首先留意一下下边的代码块,他是怎么运行的,貌似在c#中他是出错的,不应该出现这样的写法的,但在scala中侧不然: package com.dt.study /** * The package ...
- UVM中的class--2
1)uvm_component从uvm_report_object继承而来,提供的功能包括: 1)Hierarchy,-----searching and traversing component h ...
- jquery-mobile之loading加载自定义
用jquery-mobile的时候,我们发现文档中loading是直接通过标签属性进行渲染,封装的函数必须通过点击按钮才能执行.而实际运用中,我们的加载开始和结束可能不需要点击,而是通过某个函数调用直 ...
- 左 or 右
背景: 掌握的知识:C++.MFC.设计模式.STL,熟悉windows网络编程,了解COM组件但是不精. 近期辞职找工作,发现windows下的C++开发职位很少.linux和移动端开发职位多,但是 ...
- 替换所有字符串,获取url参数值
替换所有的字符串: var newStr = str.replace(/null/g, ""); 获取url参数值 <script type="text/javas ...
- phpcms V9 添加模块
为phpcms创建一个模块的开发流程 [1]创建模块目录 通过前面的学习,我们已经知道phpcms V9框架中的模块位于phcms/modules目录中,每一个目录称之为一个模块. 如果要创建一个模块 ...
- HTML5之FileReader的使用
HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型. FileReader的使用方式非常简 ...