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——第二版的更多相关文章

  1. mybatis-plus代码生成,实体类不生成父类属性

    一.参考文档: 官方文档其实说的很清楚了,可能有个别地方有点不太清楚. mybatis-plus官方: https://mp.baomidou.com/guide/generator.html 模版引 ...

  2. DataTable填补了实体类返回泛型集合

    坤哥见我昨天找了一段代码,如下面: 略微解释下,这段代码时D层查询结束后,将datatable查询到的结果赋值给实体对象的属性,然后返回实体的过程.坤哥看了之后问我,假设实体有500多个属性,难道也要 ...

  3. DataTable填充实体类返回泛型集合

    昨天找坤哥看到我的一段代码.例如以下: 略微解释下,这段代码时D层查询结束后,将datatable查询到的结果赋值给实体对象的属性,然后返回实体的过程.坤哥看了之后问我.假设实体有500多个属性.难道 ...

  4. 利用FastJson,拼接复杂嵌套json数据&&直接从json字符串中(不依赖实体类)解析出键值对

    1.拼接复杂嵌套json FastJson工具包中有两主要的类: JSONObject和JSONArray ,前者表示json对象,后者表示json数组.他们两者都能添加Object类型的对象,但是J ...

  5. spring boot JPA中实体类常用注解

    spring boot jpa中的注解很多,参数也比较多.没必要全部记住,但是经常查看官方文档也比较麻烦,记录一下一些常用的注解.通过一些具体的例子来帮助记忆. @Entity @Table(name ...

  6. KO ------- 表中字段名和实体类属性名不一致

    -----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就 ...

  7. mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_智能标签

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  8. Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264301.html     http://www.cnblogs.com/xdp-gacl/p/4264425.ht ...

  9. Hibernate第二天——实体类 与缓存机制

    第二天,我们先来了解一下框架里的一个重要概念:实体类 实体类:把数据表或其它持久化数据的格式映射成的类,就是实体类. 实体类的编写规则:由于对应的是javabean,因而也遵循javabean的一些规 ...

随机推荐

  1. Nginx执行php显示no input file specified的处理方法

    /var/www/nginx-default中放上一份phpinfo.php,使用http://localhost/phpinfo.info 访问,结果报错,显示 “No input file spe ...

  2. EBS安装过程报错,oracle.apps.fnd.txk.config.ProcessStateException: FileSys OS COMMAND Failed : Exit=2 See log for details.

    日志: Executing command: /test/software/12/startCD/Disk1/rapidwiz/jre/Linux_x64/1.6.0/bin/java -cp /te ...

  3. Unity基于响应式编程(Reactive programming)入门

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  4. Leetcode: Split Array Largest Sum

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  5. Dedesql数据库类详解

    今天花点时间讲解下织梦的sql数据库类,近期本来是准备录制一套视频教程的,但由于视频压缩的问题迟迟没有开展工作,如果大家有什么好的视频压缩方式可以通过邮件的方式告诉我:tianya#dedecms.c ...

  6. 对java多线程的认识

    多线程的概念:多线程是一种机制,它允许在程序中并发的执行多个线程,且每个线程间相互独立. 实现多线程的两种方式: 1.继承java.lang.Thread类,并且重写它的run方法,将线程的执行主体放 ...

  7. 提取SD卡中的图片

    读取SD卡的权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> ...

  8. 为什么要加 -moz- -webkit- -ms- -o- ?

    没有别的,为了兼容早期版本,为了解决CSS3标准正式发布以前的遗留问题.

  9. ADO.NET 新特性之SqlBulkCopy

    在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们 ...

  10. 用xib自定义UITableViewCell

    1.文件结构: 2. 先创建一个xib文件,删除原有的view,添加一个TableViewCell控件. 3.ModelTableViewController.m文件 #import "Mo ...