EF封装类 增加版,增加从缓存中查找数据方法,供参考!

这个类是抽象类,我这里增加了需要子类验证的方法ValidateEntity,方便扩展,若想直接使用该类,可以将该类更改成静态类,里面所有的方法都改成静态方法就可以直接调用了,可能有不足之处,欢迎大家在本文下面评论留言,共同完善,谢谢!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects.DataClasses;
using ZBService.Model;
using System.Linq.Expressions;
using System.Web; namespace ZBService
{
public abstract class ServiceBase<T> where T : EntityObject
{
/// <summary>
/// EF上下文对象
/// </summary>
protected mZhaoBiaoEntities zbEntities = new mZhaoBiaoEntities(); /// <summary>
/// 判断是否存在
/// </summary>
/// <param name="whereExpr"></param>
/// <returns></returns>
public bool Exist(Expression<Func<T, bool>> whereExpr)
{
return (this.Count(whereExpr) > 0);
} /// <summary>
/// 获取记录数
/// </summary>
/// <param name="whereExpr"></param>
/// <returns></returns>
public int Count(Expression<Func<T, bool>> whereExpr)
{
return zbEntities.CreateObjectSet<T>().Where(whereExpr).Count();
} /// <summary>
/// 查找实体对象
/// </summary>
/// <param name="whereExpr"></param>
/// <returns></returns>
public T Find(Expression<Func<T, bool>> whereExpr)
{
return zbEntities.CreateObjectSet<T>().Where(whereExpr).FirstOrDefault();
} /// <summary>
/// 从缓存中查找实体对象
/// </summary>
/// <param name="whereExpr"></param>
/// <param name="cacheKey"></param>
/// <param name="expireTime"></param>
/// <returns></returns>
public T FindFromCache(Expression<Func<T, bool>> whereExpr, string cacheKey, DateTime expireTime)
{
T entity;
object obj = HttpRuntime.Cache[cacheKey];
if (obj == null)
{
entity = this.Find(whereExpr);
HttpRuntime.Cache.Insert(cacheKey, entity, null, expireTime, System.Web.Caching.Cache.NoSlidingExpiration);
}
else
{
entity = obj as T;
}
return entity;
} /// <summary>
/// 查找实体对象列表
/// </summary>
/// <param name="whereExpr"></param>
/// <returns></returns>
public IEnumerable<T> FindList<TKey>(Expression<Func<T, bool>> whereExpr, Expression<Func<T, TKey>> orderbyExpr, int orderDirection)
{
return this.FindList<T, TKey>(whereExpr, t => t, orderbyExpr, orderDirection);
} /// <summary>
/// 从缓存中查找实体对象列表
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="whereExpr"></param>
/// <param name="orderbyExpr"></param>
/// <param name="orderDirection"></param>
/// <param name="cacheKey"></param>
/// <param name="expireTime"></param>
/// <returns></returns>
public IEnumerable<T> FindListFromCache<TKey>(Expression<Func<T, bool>> whereExpr, Expression<Func<T, TKey>> orderbyExpr, int orderDirection, string cacheKey, DateTime expireTime)
{
return this.FindListFromCache(whereExpr, t => t, orderbyExpr, orderDirection, -1, cacheKey, expireTime);
} /// <summary>
/// 查找实体对象列表
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="whereExpr"></param>
/// <param name="selectExpr"></param>
/// <param name="orderbyExpr"></param>
/// <param name="orderDirection"></param>
/// <param name="returnCount"></param>
/// <returns></returns>
public IEnumerable<TResult> FindList<TResult, TKey>(Expression<Func<T, bool>> whereExpr, Expression<Func<T, TResult>> selectExpr, Expression<Func<TResult, TKey>> orderbyExpr, int orderDirection, int returnCount = -1)
{
var result = zbEntities.CreateObjectSet<T>().Where(whereExpr).Select(selectExpr);
if (result != null && result.Count() > 0)
{
if (orderDirection > 0)
{
result = result.OrderByDescending(orderbyExpr);
}
else
{
result = result.OrderBy(orderbyExpr);
} if (returnCount > 0)
{
result = result.Take(returnCount);
} return result.ToList();
}
return null;
} /// <summary>
/// 从缓存中查找对象列表
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="whereExpr"></param>
/// <param name="selectExpr"></param>
/// <param name="orderbyExpr"></param>
/// <param name="orderDirection"></param>
/// <param name="returnCount"></param>
/// <param name="cacheKey"></param>
/// <param name="expireTime"></param>
/// <returns></returns>
public IEnumerable<TResult> FindListFromCache<TResult, TKey>(Expression<Func<T, bool>> whereExpr, Expression<Func<T, TResult>> selectExpr, Expression<Func<TResult, TKey>> orderbyExpr, int orderDirection,
int returnCount, string cacheKey, DateTime expireTime)
{
IEnumerable<TResult> resultList;
object obj = HttpRuntime.Cache[cacheKey];
if (obj == null)
{
resultList = this.FindList(whereExpr, selectExpr,orderbyExpr, orderDirection,returnCount);
HttpRuntime.Cache.Insert(cacheKey, resultList, null, expireTime, System.Web.Caching.Cache.NoSlidingExpiration);
}
else
{
resultList = obj as IEnumerable<TResult>;
}
return resultList;
} /// <summary>
/// 分页查找实体对象列表
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="whereExpr"></param>
/// <param name="selectExpr"></param>
/// <param name="orderbyExpr"></param>
/// <param name="orderDirection"></param>
/// <param name="pageSize"></param>
/// <param name="pageNo"></param>
/// <param name="recordCount"></param>
/// <returns></returns>
public IEnumerable<TResult> FindListByPage<TResult, TKey>(Expression<Func<T, bool>> whereExpr, Expression<Func<T, TResult>> selectExpr, Expression<Func<TResult, TKey>> orderbyExpr, int orderDirection, int pageSize, int pageNo, out int recordCount)
{
recordCount = 0;
var result = zbEntities.CreateObjectSet<T>().Where(whereExpr).Select(selectExpr);
if (result == null) return null;
recordCount = result.Count(); if (pageNo > recordCount) pageNo = recordCount;
if (pageNo <= 0) pageNo = 1; if (recordCount > 0)
{
if (recordCount > pageSize)
{
if (orderDirection > 0)
{
return result.OrderByDescending(orderbyExpr).Skip((pageNo - 1) * pageSize).Take(pageSize).ToList();
}
else
{
return result.OrderBy(orderbyExpr).Skip((pageNo - 1) * pageSize).Take(pageSize).ToList();
}
}
else
{
if (orderDirection > 0)
{
return result.OrderByDescending(orderbyExpr).ToList();
}
else
{
return result.OrderBy(orderbyExpr).ToList();
}
} }
return null;
} /// <summary>
/// 从缓存中分页查找实体对象列表
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="whereExpr"></param>
/// <param name="selectExpr"></param>
/// <param name="orderbyExpr"></param>
/// <param name="orderDirection"></param>
/// <param name="pageSize"></param>
/// <param name="pageNo"></param>
/// <param name="recordCount"></param>
/// <param name="cacheKey"></param>
/// <param name="expireTime"></param>
/// <returns></returns>
public IEnumerable<TResult> FindListByPageFromCache<TResult, TKey>(Expression<Func<T, bool>> whereExpr, Expression<Func<T, TResult>> selectExpr, Expression<Func<TResult, TKey>> orderbyExpr, int orderDirection, int pageSize, int pageNo, out int recordCount,
string cacheKey, DateTime expireTime)
{
recordCount = 0;
IQueryable<TResult> result;
object obj = HttpRuntime.Cache[cacheKey];
if (obj == null)
{
result = zbEntities.CreateObjectSet<T>().Where(whereExpr).Select(selectExpr);
}
else
{
result = obj as IQueryable<TResult>;
} if (result == null) return null;
recordCount = result.Count(); if (pageNo > recordCount) pageNo = recordCount;
if (pageNo <= 0) pageNo = 1; if (recordCount > 0)
{
if (recordCount > pageSize)
{
if (orderDirection > 0)
{
return result.OrderByDescending(orderbyExpr).Skip((pageNo - 1) * pageSize).Take(pageSize).ToList();
}
else
{
return result.OrderBy(orderbyExpr).Skip((pageNo - 1) * pageSize).Take(pageSize).ToList();
}
}
else
{
if (orderDirection > 0)
{
return result.OrderByDescending(orderbyExpr).ToList();
}
else
{
return result.OrderBy(orderbyExpr).ToList();
}
} }
return null; } /// <summary>
/// 增加实体
/// </summary>
/// <param name="entity"></param>
public virtual void Add(T entity)
{
this.ValidateEntity(entity, ValidateMode.Add);
zbEntities.CreateObjectSet<T>().AddObject(entity);
} /// <summary>
/// 增加实体列表
/// </summary>
/// <param name="entities"></param>
public virtual void AddList(IEnumerable<T> entities)
{
var objSet = zbEntities.CreateObjectSet<T>();
foreach (T entity in entities)
{
this.ValidateEntity(entity, ValidateMode.Add);
objSet.AddObject(entity);
}
} /// <summary>
/// 更新已分离实体,若未分离则不需要执行该方法
/// </summary>
/// <param name="entity"></param>
public virtual void Update(T entity)
{
this.ValidateEntity(entity, ValidateMode.Update);
zbEntities.CreateObjectSet<T>().ApplyCurrentValues(entity);
} /// <summary>
/// 删除实体
/// </summary>
/// <param name="entity"></param>
public virtual void Delete(T entity)
{
this.ValidateEntity(entity, ValidateMode.Delete);
zbEntities.CreateObjectSet<T>().DeleteObject(entity);
} /// <summary>
/// 删除实体
/// </summary>
/// <param name="whereExpr"></param>
public virtual void Delete(Expression<Func<T, bool>> whereExpr)
{
var objSet = zbEntities.CreateObjectSet<T>();
T entity = objSet.Where(whereExpr).Single();
//this.ValidateEntity(entity, ValidateMode.Delete);
objSet.DeleteObject(entity);
} /// <summary>
/// 删除实体列表
/// </summary>
/// <param name="entities"></param>
public virtual void DeleteList(IEnumerable<T> entities)
{
var objSet = zbEntities.CreateObjectSet<T>();
foreach (T entity in entities)
{
//this.ValidateEntity(entity, ValidateMode.Delete);
objSet.DeleteObject(entity);
}
} /// <summary>
/// 提交保存所有变更操作
/// </summary>
public void SubmitSave()
{
zbEntities.SaveChanges();
} /// <summary>
/// 验证
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
protected virtual void ValidateEntity(T entity, ValidateMode mode = ValidateMode.Add)
{ } /// <summary>
/// 验证模式
/// </summary>
protected enum ValidateMode
{
Add = 0,
Update = 1,
Delete = -1
} }
}

之前发表的文章详见:http://www.cnblogs.com/zuowj/p/4259515.html

EF封装类 增加版,增加从缓存中查找数据方法,供参考!的更多相关文章

  1. springboot中如何向redis缓存中存入数据

    package com.hope;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jack ...

  2. 获取apache ignite缓存中的数据行数少于实际行数

    我将ignite项目打包放到linux下,在linux下获取window中存放在oracle数据库中的数据,linux服务器作为ignite的服务端节点,我在本地启动tomact,作为ignite客户 ...

  3. 【EF学习笔记05】----------操作内存中的数据

    SingleOrDefault实验 //SingleOrDefault实验 using (var db = new Entities()) { var classes = new Classes() ...

  4. linux上查找文件存放地点和文件中查找字符串方法

    一.查找文件存放地点 1.locate 语法:locate <filename> locate命令实际是"find -name"的另一种写法,但是查找方式跟find不同 ...

  5. sql server 如何在全库中查找数据在哪个表

    1.查找字段在库中哪个表 如果要查找FName select   a.name,b.name   from   syscolumns a   inner   join   sysobjects   b ...

  6. volley6--CacheDispatcher从缓存中获取数据

    源码: /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, V ...

  7. 数据库default null字段用基本类型映射,改成包装类型后缓存中旧数据反序列化失败

    rt,spring Temp不知道用的什么反序列化,int不能反序列化为Integer,后实验hissing是可以的int->Integer  Integer(不为null)->int均可

  8. MySQL 删除数据库中重复数据方法

    1. 查询需要删除的记录,会保留一条记录. select a.id,a.subject,a.RECEIVER from test1 a left join (select c.subject,c.RE ...

  9. Python中查找字符串方法的速度比较

随机推荐

  1. POI 设置EXCEL单元格格式(日期数字文本等)

    HSSFCellStyle style0 = workbook2003.createCellStyle(); style0.setBorderBottom(HSSFCellStyle.BORDER_T ...

  2. go2shell的安装与修改默认terminal方法

    go2shell的安装与修改默认terminal方法   1. 安装go2shell后,打开finder的application文件夹,找到go2shell 2. 按住command,用鼠标将go2s ...

  3. GPS accuracy in Android

    Get the estimated accuracy of this location, in meters. We define accuracy as the radius of 68% conf ...

  4. Git + BeyondCompare

    Mac 环境: 1. 安装 BeyondCompare 2. 配置 ~/.gitconfig [diff] tool = bcomp [merge] tool = bcomp [difftool &q ...

  5. Android应用中动态更改主题的实现

    在android应用程序中我们可能需要切换模式,如晚上切换到夜间模式便于阅读等.本文参考了网上的一些资料,并结合实例,实现了动态更改主题的效果. Android中实现theme主题可以使用在activ ...

  6. fflua更新-增加对引用的支持

    简介: fflua 发布了有段时间了,很多网友都用了,并且提供了一些很好的反馈.其中一个就是c++接口注册到lua中时,对引用的支持.这样使用起来更加方便. 原有方式: fflua 中注册c++的类用 ...

  7. Spring mvc4 + ActiveMQ 整合

    一.配置部分 二.代码部分 三.页面部分 四.Controller控制器 五.效果展示 六.加入监听器 七.最最重要的,别忘了打赏 一.配置部分 ActiveMQ的安装这就不说了,很简单, 这个例子采 ...

  8. linux 笔试题

    一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来 ...

  9. Android WebView Demo

    activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android& ...

  10. typeof instanceof 之间的区别总结

        typeof   它返回值是一个字符串,该字符串说明运算数的类型. a=1; b=true; c="c"; d=function(){ console.log(" ...