/*
* ------------------------------------------------------------------------------
*
* 创 建 者:F_Gang @2019
*
* 创建日期:2019-08-27 17:21:31
*
* 机器名称:DESKTOP-QUSP01L
*
* 版 本 号:4.0.30319.42000
*
* 功能描述:
*
* ------------------------------------------------------------------------------
*/ using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using XinLianXin.Utility; namespace MyProject.DAL
{
/// <summary>
/// EF DataAccessLayer 基类
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseicService<T> where T : class, new()
{
#region 基础
/// <summary>
/// 上下文
/// </summary>
protected readonly BaseDBContext dB; /// <summary>
/// 构造方法
/// </summary>
/// <param name="db"></param>
public BaseicService(BaseDBContext db)
{
dB = db;
} public void Dispose()
{
dB.Dispose();
}
#endregion #region Add
/// <summary>
/// 增加一条数据
/// </summary>
/// <param name="t"></param>
/// <returns>返回新增实体对象,考虑到使用新增主键编号</returns>
public T AddEntity(T t)
{
dB.Entry<T>(t).State = EntityState.Added;
if (dB.SaveChanges() > )
return t;
return null;
} /// <summary>
/// 批量增加多条数据到一张表(事务处理)
/// </summary>
/// <param name="ts">实体对象集合</param>
/// <returns></returns>
public bool AddEntity(IQueryable<T> ts)
{
dB.Set<T>().AddRange(ts);
return dB.SaveChanges() > ;
}
#endregion #region Modify
/// <summary>
/// 编辑一条数据,返回bool 类型
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public bool ModifyEntity(T t)
{
dB.Entry<T>(t).State = EntityState.Modified;
return dB.SaveChanges() > ;
} /// <summary>
/// 批量修改
/// </summary>
/// <param name="ts"></param>
/// <returns></returns>
public bool ModifyEntity(IQueryable<T> ts)
{
ts.ForEachAsync(o => { dB.Entry<T>(o).State = EntityState.Modified; });
return dB.SaveChanges() > ;
} /// <summary>
/// 修改一条数据,会修改指定列的值
/// </summary>
/// <param name="t">要修改的实体对象</param>
/// <param name="proNames">要修改的属性名称</param>
/// <returns></returns>
public bool ModifyEntity(T t, params string[] proNames)
{
DbEntityEntry<T> dbe = dB.Entry<T>(t); //先将所有属性状态标记为未修改
dbe.State = EntityState.Unchanged; //将要修改的属性状态标记为修改
proNames.ToList().ForEach(o => dbe.Property(o).IsModified = true); return dB.SaveChanges() > ;
} /// <summary>
/// 根据条件批量修改指定的列
/// </summary>
/// <param name="t"></param>
/// <param name="conditions">lambda</param>
/// <param name="proNames"></param>
/// <returns></returns>
public bool ModifyEntity(T t, Expression<Func<T, bool>> conditions, params string[] proNames)
{
var entitys = dB.Set<T>().Where(conditions).ToList();
PropertyInfo[] proinfos = t.GetType().GetProperties();
List<PropertyInfo> list = new List<PropertyInfo>();
proinfos.ToList().ForEach(o => { if (proNames.Contains(o.Name)) list.Add(o); });
entitys.ForEach(c => { list.ForEach(o => { object value = o.GetValue(t, null); o.SetValue(c, value, null); }); });
return dB.SaveChanges() > ;
}
#endregion #region Delete
/// <summary>
/// 删除一个实体对象
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public bool DeleteEntity(T t)
{
dB.Entry<T>(t).State = EntityState.Deleted;
return dB.SaveChanges() > ;
} /// <summary>
/// 根据条件删除单个实体对象
/// </summary>
/// <param name="conditions">lambda</param>
/// <returns></returns>
public bool DeleteSingleObj(Expression<Func<T, bool>> conditions)
{
var obj = dB.Set<T>().FirstOrDefault(conditions);
if (obj == null) throw new Exception("您要删除的内容已不存在");
dB.Entry<T>(obj).State = EntityState.Deleted;
return dB.SaveChanges() > ;
} /// <summary>
/// 根据条件批量删除
/// </summary>
/// <param name="conditions">lambda</param>
/// <returns></returns>
public bool BatchDeletion(Expression<Func<T, bool>> conditions)
{
var datas = dB.Set<T>().Where(conditions).ToList();
dB.Set<T>().RemoveRange(datas);
return dB.SaveChanges() > ;
}
#endregion #region Select
/// <summary>
/// 根据条件查询实体对象
/// </summary>
/// <param name="conditions">lambda</param>
/// <returns></returns>
public T GetEntityByQuery(Expression<Func<T, bool>> conditions)
{
return dB.Set<T>().FirstOrDefault(conditions);
} /// <summary>
/// 根据条件查询所有
/// </summary>
/// <param name="conditions">lambda</param>
/// <returns></returns>
public IQueryable<T> GetAll()
{
return dB.Set<T>().AsQueryable();
} /// <summary>
/// 根据条件查询所有
/// </summary>
/// <param name="conditions">lambda</param>
/// <returns></returns>
public IQueryable<T> GetListByQuery(Expression<Func<T, bool>> conditions)
{
return dB.Set<T>().Where(conditions).AsQueryable();
} /// <summary>
/// 根据条件查询列表
/// </summary>
/// <typeparam name="S">Sort fields</typeparam>
/// <param name="conditions">lambda</param>
/// <param name="orderByLambds"></param>
/// <param name="isAsc">是否倒叙</param>
/// <returns></returns>
public IQueryable<T> GetListByQuery<TKey>(Expression<Func<T, bool>> conditions, Expression<Func<T, TKey>> orderByLambds, bool isAsc)
{
var temp = dB.Set<T>().Where(conditions);
if (isAsc)
return temp.OrderBy(orderByLambds).AsQueryable();
else
return temp.OrderByDescending(orderByLambds).AsQueryable();
} #region 带分页查询
/// <summary>
/// 带分页查询
/// </summary>
/// <typeparam name="S"></typeparam>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="conditions">查询条件</param>
/// <param name="orderKey">排序字段</param>
/// <param name="isAsc">是否倒叙</param>
/// <param name="rows">返回总条数</param>
/// <param name="totalPage">返回总页数</param>
/// <returns></returns>
public IQueryable<T> GetPageListByQuery<TKey>(int pageIndex, int pageSize, Expression<Func<T, bool>> conditions, Expression<Func<T, TKey>> orderKey, bool isAsc, out int rows, out int totalPage)
{
var temp = dB.Set<T>().Where(conditions);
rows = temp.Count(); totalPage = GetTotalPage(rows, pageSize); if (isAsc)
temp = temp.OrderBy(orderKey);
else
temp = temp.OrderByDescending(orderKey); temp = temp.Skip(pageSize * (pageIndex - )).Take(pageSize).AsQueryable(); return temp;
}
#endregion #region 传统sql结合EF分页实现查询 fg 2019年8月28日
/// <summary>
/// 传统sql结合EF分页实现查询
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="sql"></param>
/// <param name="where">条件</param>
/// <param name="orderKey">排序字段</param>
/// <param name="isAsc">是否倒叙</param>
/// <param name="rows">返回总条数</param>
/// <param name="totalPage">总页数</param>
/// <returns></returns>
public IQueryable<T> GetPageListByQuery(int pageIndex, int pageSize, string sql, string where, string orderKey, bool isAsc, out int rows, out int totalPage)
{
if (string.IsNullOrEmpty(sql))
throw new Exception("sql 存在空内容,请核实后在尝试"); sql = sql + " WHERE 1 = 1 " + where;
if (!string.IsNullOrEmpty(orderKey))
sql += " ORDER BY " + orderKey;
if (!isAsc)
sql += " DESC "; var temp = dB.Database.SqlQuery<T>(sql).AsQueryable();
rows = temp.Count();
totalPage = GetTotalPage(rows, pageSize);
temp = temp.Skip(pageSize * (pageIndex - )).Take(pageSize);
return temp;
} #region 计算分页总页数
/// <summary>
/// 返回总页数
/// </summary>
/// <param name="rows">总统条数</param>
/// <param name="pageSize">页大小</param>
/// <returns></returns>
private int GetTotalPage(int rows, int pageSize)
{
if (rows % pageSize == )
return rows / pageSize;
return rows / pageSize + ;
}
#endregion
#endregion
#endregion #region 显式Tran 事务
/// <summary>
/// 显式执行事务
/// </summary>
/// <param name="dics"></param>
/// <returns></returns>
public int ExeTran(IDictionary<string, DbParameter[]> dics)
{
int result = ;
string outmsg = string.Empty;
DbConnection con = ((IObjectContextAdapter)dB).ObjectContext.Connection;
using (DbTransaction tran = con.BeginTransaction())
{
try
{
// 使用传统的执行事务的方法
foreach (var dic in dics)
{
if (dic.Value != null)
result += dB.Database.ExecuteSqlCommand(dic.Key, dic.Value);
else
result += dB.Database.ExecuteSqlCommand(dic.Key, dic.Value);
} tran.Commit();
return result; }
catch (Exception ex)
{
tran.Rollback();
LogHelper.Default.WriteError(string.Format("事务执行失败:") + ex.Message +
string.Format("\n执行内容:" + JsonHelper.ToJSON(dics, out outmsg)));
throw ex;
}
finally
{
con.Close();
}
}
}
#endregion
}
}

自定义排序用法:

     string outmsg = string.Empty;

            try
{
int rows = ;
int totalPath = ;
// 排序字段类型 查询条件 排序条件
return newsDAL.GetPageListByQuery<string>(pageInde, pageSize, o => o.c_user_id == , o => o.zhaiyao, false, out rows, out totalPath).ToList();
}
catch (Exception ex)
{
outmsg = ex.Message;
return null;
}

EntityFramework 基类重写的更多相关文章

  1. 【转载】 C++多继承中重写不同基类中相同原型的虚函数

    本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...

  2. asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件

    public class BasePage:Page protected override void OnPreLoad(EventArgs e){     base.OnPreLoad(e);    ...

  3. wpf之mvvm基类

    当我们用MVVM设计模式的时候要实现INotifyPropertyChanged,每次都要实现这个接口比较麻烦,所以基类的作用就体现出来了.代码如下:   1 2 3 4 5 6 7 8 9 10 1 ...

  4. MVC的基类

    设计一个验证用户身份是否登陆的基类BaseController /// <summary> /// 所有需要进行登录控制的控制器基类 /// </summary> public ...

  5. Java如何解决脆弱基类(基类被冻结)问题

    概述  大多数好的设计者象躲避瘟疫一样来避免使用实现继承(extends 关系).实际上80%的代码应该完全用interfaces写,而不是通过extends.“JAVA设计模式”一书详细阐述了怎样用 ...

  6. EF实体框架数据操作基类(转)

    //----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司 ...

  7. C#编程语言与面向对象——抽象基类与接口

    在一个类前加“abstract”关键字,此类就成为抽象类. 对应的,在一个方法前加“abstract”关键字,此方法就成为抽象方法. abstract class Fruit //抽象类 { publ ...

  8. C#读取XML文件的基类实现

    刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...

  9. Android 自定义Activity基类与TitleBar

    我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...

随机推荐

  1. constant timer(固定定时器),constant throughput timer(常数吞吐量定时器);多个请求,某个请求a下,设置常数吞吐量定时器,模式:all active threads(shared)则所有请求吞吐量一致;

    1.两请求之间添加'固定定时器' 1000ms,那么两请求发送间隔时间是多少? 1000ms吗? 由实验得出,2个请求发送间隔时间 = 1000ms + 第一个请求时间(发出至完成后时间) 2.单个请 ...

  2. JWT(Json Web Token):一种在Web应用中安全传递信息的规范 转载

    文本将介绍一种在Web应用中安全传递信息的方式,称为JWT. 本文内容是对JWT官网介绍说明的英文翻译而来,由于本文英文水平有限,如有错误,还请指出,谢谢. What is JSON Web Toke ...

  3. OSI网络七层模型、TCP/IP 模型(四)

    OSI 是 Open System Interconnection 的缩写,译为“开放式系统互联”. OSI 模型把网络通信的工作分为 7 层,从下到上分别是物理层.数据链路层.网络层.传输层.会话层 ...

  4. mongo db 去除 _class 字段

    import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.NoSuc ...

  5. T430 Linux Setting Memo

    touchpad:xinput listxinput --disable 11 dns setting:/etc/resolv.conf vpn:@Darkduck19XX yum-config-ma ...

  6. SWA2G422&485JK2G基础篇: STM32+W5500实现MQTT通信控制,485/422透传通信

    说明 这节实现的功能: STM32+W5500实现MQTT通信控制 细节功能: 1.DHCP动态获取IP 2.DNS域名解析 3.网口<--MQTT-->485/422透传通信 测试准备工 ...

  7. Educational Codeforces Round 59 (Rated for Div. 2) E 区间dp + 状态定义 + dp预处理(分步dp)

    https://codeforces.com/contest/1107/problem/E 题意 给出01字符串s(n<=100),相邻且相同的字符可以同时消去,一次性消去i个字符的分数是\(a ...

  8. 计时任务之StopWatch

    StopWatch对应的中文名称为秒表,经常我们对一段代码耗时检测的代码如下: long startTime = System.currentTimeMillis(); // 业务处理代码 doSom ...

  9. Oracle 10G RAC集群安装

    一,基本环境配置 01,hosts cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.loc ...

  10. OsharpNS轻量级.net core快速开发框架简明入门教程-多上下文配置(多个数据库的使用)

    OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...