实体类调用泛型父类中的静态方法中执行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的一些规 ...
随机推荐
- Python基础二. 数据结构、控制流、运算符、真值测试
一.概述 数据结构上广义上有两种,单一类型和集合类型 单一类型,表示一种对象 集合类型,表示包含多种对象 Python 中的内建的数据类型有str.list.tuple.dict.set.number ...
- jQuery源代码学习之七—队列模块queue
一.jQuery种的队列模块 jQuery的队列模块主要是为动画模块EFFECTS提供支持,(不过到现在为了支持动画队列的inprogress的出入队还是搞不太清楚),单独抽取出一个命名空间是为了使程 ...
- 快速激活JetBrains PhpStorm WebStorm系列产品
从官方网站下载正版PhpStorm 安装后,注册时选择“License server” 输入“http://idea.lanyus.com/” (不带双引号,后面的斜杠要带上) 完成 恭喜你 激活Je ...
- fiddler note
一晚上终于找到对的东西,作者很专业,这里作为笔记,想学习好东西还是到作者那里^_^ ---------------------------------------------------------- ...
- AngularJS安装配置与基础概要整理(上)
以前整理的,可供参考. 安装: 1.首先要安装node.js和它的npm包管理系统.(nodejs相关待整理) 2.安装grunt .grunt是一个基于任务的Javascript工程命令行构建工具. ...
- Communication 交流
1:请不要立马抗拒别人的观点,先沉默下来思考,在做出回应. 2:在与别人交流的时候,请尽量先让别人同意你的观点,找到共同点,让别人回答 "是";
- WPF关于Generic.xaml
如果需要用到Themes/Generic.xaml作为默认风格资源文件,不要忘了该项目的AssemblyInfo.cs中必须要有以下这段: [assembly: ThemeInfo( Resource ...
- echo(),print(),print_r(),var_dump的区别?
常见的输出语句 echo()可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用. print()函 ...
- StructureMap使用方法(转)
终于到了题目中的MVC使用StructureMap依赖注入的配置与实现了.在ASP.Net三层架构应用中StructureMap的是最老的IOC/DI工具,也就是依赖注入,很多线上的项目都使用了Str ...
- 阿里云OneinStack,Linux下tomcat命令
阿里云OneinStack,Linux下tomcat命令 Linux下如何查看tomcat是否启动在Linux系统下,重启Tomcat使用命令操作的首先,进入Tomcat下的bin目录cd /usr/ ...