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. 使用 robotframework 自动化测试系列 一 -----简介

    robotframework 是自动化测试框架. Robot Framework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可 ...

  2. PHP Apache服务配置

    第一步:在C:\Windows\System32\drivers\etc中找到hosts配置服务 127.0.0.1 localhost 127.0.0.1 www.psq.com 保存即可 第二步: ...

  3. [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. hihocoder 网易游戏2016实习生招聘在线笔试 解题报告

    比赛笔试链接:http://hihocoder.com/contest/ntest2015april/problems 题目就不贴了. 1.推箱子. 思路:纯模拟. 代码(28MS): #includ ...

  5. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

  6. sklearn Model-selection + Pipeline

    1 GridSearch import numpy as np from sklearn.datasets import load_digits from sklearn.ensemble impor ...

  7. Elasticsearch(入门篇)——Query DSL与查询行为

    ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求.更多内容请参考:ELK修炼之道 Query DSL结构化查询 Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句.采用A ...

  8. 遍历对象所有属性(json对象)

    var response = { "status": 1, "message": "\u6210\u529f", "data&qu ...

  9. Upload file

    <h3>Upload File</h3> <form action="@Url.Action("Upload","UploadCo ...

  10. Dynamics AX 2012 R3 Demo 安装与配置 - 导入测试数据 (Step 4)

        在前面三节中,Reinhard分别讲解了如何配置安装环境,安装数据库服务器,AOS和客户端,安装后的编译和配置.如果一直跟随Reinhard的脚步,到这里,已经拥有一个没有数据的系统.     ...