实体类调用泛型父类中的静态方法中执行CRUD——第一版

    public abstract class LYEntityDbContext<DB, T>
        where DB : DbContext, new()
        where T : LYEntityDbContext<DB, T> {
        public void GenerateHashCode() {
            var thisTime = this.GetType().GetProperties().Select(p => p.GetValue(this).GetHashCode());
            this.changes.Add(thisTime);
        }
        private List<IEnumerable<int>> changes = new List<IEnumerable<int>>();
        private bool executed = true;
        private bool hasChanged {
            get {
                if (this.changes.Count < 2) {
                    return false;
                }
                var result = !this.changes.First().Except(this.changes.Last()).Any();
                return result;
            }
        }

        public bool Executed() {
            return this.executed;
        }
        public static IEnumerable<T> Find(Action<T> action, params object[] keyValues) {
            return Find(action, true, keyValues);
        }

        public static IEnumerable<T> Find(Action<T> action, bool inBatch, params object[] keyValues) {
            if (inBatch) {
                using (var db = new DB()) {
                    var hasChanged = false;
                    for (int i = 0; i < keyValues.Length; i++) {
                        var id = keyValues[i];
                        var t = db.Set<T>().Find(id);
                        yield return t;
                        t.GenerateHashCode();
                        action(t);
                        t.GenerateHashCode();
                        if (!hasChanged) {
                            hasChanged = t.hasChanged;
                        }
                    }
                    if (hasChanged) {
                        db.SaveChanges();
                    }
                }
            } else {
                foreach (var id in keyValues) {
                    yield return Find(action, id);
                }
            }
        }
        public static T Find(Action<T> action, object id) {
            using (var db = new DB()) {
                var t = db.Set<T>().Find(id);
                t.GenerateHashCode();
                action(t);
                t.GenerateHashCode();
                if (t.hasChanged) {
                    try {
                        db.SaveChanges();
                        t.executed = true;
                    } catch (Exception) {
                        t.executed = false;
                    }
                }
                return t;
            }
        }
        public static IEnumerable<T> FindAll<P>(Func<T, bool> where, Func<T, P> orderby, int skip, int take, out int all) {
            using (var db = new DB()) {
                if (where == null) {
                    var r = db.Set<T>();
                    all = r.Count();
                    return r;
                }
                all = db.Set<T>().Count(where);
                if (orderby == null) {
                    var r = db.Set<T>().Where(where);
                    return r;
                }
                if (take <= 0) {
                    var r = db.Set<T>().Where(where).OrderBy(orderby);
                    return r;
                }
                if (skip <= 0) {
                    var r = db.Set<T>().Where(where).OrderBy(orderby).Take(take);
                    return r;
                }
                var rr = db.Set<T>().Where(where).OrderBy(orderby).Skip(skip).Take(take);
                return rr;
            }
        }
    }
时间: 2024-08-25 19:36:42

实体类调用泛型父类中的静态方法中执行CRUD——第一版的相关文章

关于List&lt;&gt;(实体类)泛型集合转DataTable_ONE

// 泛型集合转DataTable,T为Linq实体类 public delegate void GetDataTableRow<T>(T t,System.Data.DataTable d);        public static void ExcelOut2<T>(DataGrid gt, GetDataTableRow<T> GetDataTableRow)        {                            ItemCollection

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

-----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就会为空 (一)问题复现 1.先创建数据库 mybatis_db, 再创建表 t_user,并插入若干数据 注意:user_id 为主键,且为自动增长 2.创建实体类 User.java: package com.siwuxie095.entity; // 实体类 public class User

eclipse从数据库逆向生成Hibernate实体类(eclipse中反向生成hibernate实体类+jpa注释)

eclipse从数据库逆向生成Hibernate实体类 做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再"自己"建立一变VO.意思是,在项目设计时,要么根据需求分析建立实体类,由正向生成数据库表:要么就先进行数据库表设计,再逆向生成实体类.没有说进行完任意一方的设计后再去花时间去自己匹配建立另一方的设计. 原因是: 1. 1.5倍工作量,浪费时间.(时间对公司来说很重要) 2. 无法

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

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.cnsdhzzl.dao.StudentDao&q

关于mybatis中的实体类属性与数据库中的列名不一致的两种解决方法

1.我们都知道,在mybatis中写实体类的时候,是按照数据库中的列名来给实体类定义属性的,举个例子: public class User implements Serializable { private Integer id; private String username; private String address; private String sex; private Date birthday; } 2.但是,如果我们在定义实体类的时候,实体类中的属性与数据库列名不一致呢?比如:

ADO面向对象使用(实体类、数据访问类、范型集合)

ADO面向对象使用: !!!!!在其它文件夹下创建新类,加public!再考虑是不是引用数据库命名空间和其它类的命名空间!是否需要将构造函数写出来,将数据库的两个类实例化!!!!! 实体类:就是封装,将数据库中的表封装成同名的类,里面的成员变量与表里面的列是对应的,一个对象就代表数据库中一行数据: 字段扩展:查询关联的外键表数据,只读! 数据访问类:就是对于实体类对应的数据库进行操作的,就是写方法! 泛型集合: List<T> list = new List<T>(); T代表的就

06Hibernate实体类生命周期

前言:Session接口是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的增删查改方法,而且Session具有一个缓存它是Hibernate的一级缓存.站在持久化层的角度,Hibernate把实体类分为4种状态:持久化状态.临时状态.游离状态和删除状态.本文将会介绍Hibernate这些机制的细节以及使用方法. 1.Hibernate的Session缓存 (1)Session缓存的作用 使用Session的缓存有三大作用: 减少访问数据库的频率,当Session的get()

MyBatis学习总结4--解决字段名与实体类属性名不相同的冲突

在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定是完全相同的,如果直接在xml映射文件中使用sql进行映射,会造成返回值为空的情况,下面阐述解决方案: 测试所用表和数据 create table orders( order_id int primary key auto_increment, order_no varchar(20), order_price float ); insert into orders(order_no, order_price) values('aaa

eclipse逆向生成实体类

(转自:http://blog.csdn.net/wangpeng047/article/details/6877720) 做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再"自己"建立一变VO.意思是,在项目设计时,要么根据需求分析建立实体类,由正向生成数据库表:要么就先进行数据库表设计,再逆向生成实体类.没有说进行完任意一方的设计后再去花时间去自己匹配建立另一方的设计. 原因是: