EF封装类 增加版,增加从缓存中查找数据方法,供参考!
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封装类 增加版,增加从缓存中查找数据方法,供参考!的更多相关文章
- springboot中如何向redis缓存中存入数据
package com.hope;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jack ...
- 获取apache ignite缓存中的数据行数少于实际行数
我将ignite项目打包放到linux下,在linux下获取window中存放在oracle数据库中的数据,linux服务器作为ignite的服务端节点,我在本地启动tomact,作为ignite客户 ...
- 【EF学习笔记05】----------操作内存中的数据
SingleOrDefault实验 //SingleOrDefault实验 using (var db = new Entities()) { var classes = new Classes() ...
- linux上查找文件存放地点和文件中查找字符串方法
一.查找文件存放地点 1.locate 语法:locate <filename> locate命令实际是"find -name"的另一种写法,但是查找方式跟find不同 ...
- sql server 如何在全库中查找数据在哪个表
1.查找字段在库中哪个表 如果要查找FName select a.name,b.name from syscolumns a inner join sysobjects b ...
- volley6--CacheDispatcher从缓存中获取数据
源码: /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, V ...
- 数据库default null字段用基本类型映射,改成包装类型后缓存中旧数据反序列化失败
rt,spring Temp不知道用的什么反序列化,int不能反序列化为Integer,后实验hissing是可以的int->Integer Integer(不为null)->int均可
- MySQL 删除数据库中重复数据方法
1. 查询需要删除的记录,会保留一条记录. select a.id,a.subject,a.RECEIVER from test1 a left join (select c.subject,c.RE ...
- Python中查找字符串方法的速度比较
随机推荐
- JavaScript 中数组实用浅析
本文适用于HTML.ASP 中的 JavaScript 脚本代码.代码以 HTML 中的 JS 为例,如果在 ASP 中,请将 document.write 改为 Response.Write 即可. ...
- easyui中 在子tabs中 添加新的tabs
function addToParentTab(title, url) { self.parent.addTabIgnoreExist(title, url, 'icon-cha ...
- Android Studio如何引用外部Library工程
参考: http://stackoverflow.com/questions/16588064/how-do-i-add-a-library-project-to-the-android-stu ...
- .NET 4.6中的性能改进
.NET 4.6中带来了一些与性能改进相关的CLR特性,这些特性中有一部分将会自动生效,而另外一些特性,例如SIMD与异步本地存储(Async Local Storage)则需要对编写应用的方式进行某 ...
- 搭建mongodb集群(副本集+分片)
搭建mongodb集群(副本集+分片) 转载自:http://blog.csdn.net/bluejoe2000/article/details/41323051 完整的搭建mongodb集群(副本集 ...
- java代写
Computer Science, Claremont McKenna CollegeCS51.2 - Introduction to Computer Science, Fall 2014Probl ...
- BW:如何加载和生成自定义的层次结构,在不使用平面文件的SAP业务信息仓库
介绍 通常情况下,报告需要在一个类似树的结构来显示数据.通过启用此特性在SAP BW层次结构.高级数据显示的层次结构的顶层节点.更详细的数据可以向下钻取到的层次结构中的下级节点的可视化. 考虑一个例子 ...
- spring之ControllerAdvice注解
@ControllerAdvice是Spring 3.2新增的注解,主要是用来Controller的一些公共的需求的低侵入性增强提供辅助,作用于@RequestMapping标注的方法上. Contr ...
- Mac OS X Terminal 101:终端使用初级教程
Mac OS X Terminal 101:终端使用初级教程 发表于 2012 年 7 月 29 日 由 Renfei Song | 文章目录 1 为什么要使用命令行/如何开启命令行? 2 初识Com ...
- iOS开发——项目实战总结&经典错误一
经典错误一 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7, VA 运行报错 出现的原因:armv7s ...