浅析.Net数据操作机制
举个栗子,获取新闻详情的案例。
public ActionResult NewsView(int newsId)
{
var news = _newsService.GetNewsById(newsId); // 获取数据
NewsModel newsItem = new NewsModel(); // 新建模型存储数据
if (null != news)
{
newsItem.Id = news.Id;
newsItem.Title = news.Title;
newsItem.Short = news.Short;
newsItem.Full = news.Full;
newsItem.AllowComments = news.AllowComments;
newsItem.CommentCount = news.CommentCount;
newsItem.PrizeCount = news.PrizeCount;
newsItem.ClickCount = news.ClickCount + 1;
newsItem.CreatedOn = news.CreatedOn.ToString("yyyy-MM-dd HH:mm:ss"); // 处理日期
newsItem.IsPrize = null != news.NewsComments.FirstOrDefault(m => m.IsPrize);
if (news.NewsPictures.Count > 0) // 处理新闻图片
{
foreach (var itemp in news.NewsPictures.OrderBy(m => m.DisplayOrder))
{
newsItem.CoverImgUrls.Add(_pictureService.GetPictureUrl(itemp.PictureId));
}
}
news.ClickCount++;
_newsService.UpdateNews(news); // 更新点击数量
}
return View(newsItem); // 将数据传入界面端
}
再谈_newsService如何获取数据。
using Nop.Core;
using Nop.Core.Data;
using Nop.Core.Domain.News;
using Nop.Services.Events;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Nop.Services.News
{
/// <summary>
/// News service
/// </summary>
public partial class NewsService : INewsService
{
#region Fields
private readonly IRepository<NewsItem> _newsItemRepository;
private readonly IRepository<NewsComment> _newsCommentRepository;
private readonly IRepository<NewsPicture> _newsPictureRepository;
private readonly IEventPublisher _eventPublisher;
#endregion
#region Ctor
public NewsService(IRepository<NewsItem> newsItemRepository,
IRepository<NewsComment> newsCommentRepository,
IRepository<NewsPicture> newsPictureRepository,
IEventPublisher eventPublisher)
{
this._newsItemRepository = newsItemRepository;
this._newsCommentRepository = newsCommentRepository;
this._newsPictureRepository = newsPictureRepository;
this._eventPublisher = eventPublisher;
}
#endregion
#region Methods
/// <summary>
/// Deletes a news
/// </summary>
/// <param name="newsItem">News item</param>
public virtual void DeleteNews(NewsItem newsItem)
{
if (newsItem == null)
throw new ArgumentNullException("newsItem");
_newsItemRepository.Delete(newsItem);
//event notification
_eventPublisher.EntityDeleted(newsItem);
}
/// <summary>
/// Gets a news
/// </summary>
/// <param name="newsId">The news identifier</param>
/// <returns>News</returns>
public virtual NewsItem GetNewsById(int newsId)
{
if (newsId == 0)
return null;
return _newsItemRepository.GetById(newsId);
}
/// <summary>
/// Gets all news
/// </summary>
/// <param name="languageId">Language identifier; 0 if you want to get all records</param>
/// <param name="storeId">Store identifier; 0 if you want to get all records</param>
/// <param name="pageIndex">Page index</param>
/// <param name="pageSize">Page size</param>
/// <param name="showHidden">A value indicating whether to show hidden records</param>
/// <returns>News items</returns>
public virtual IPagedList<NewsItem> GetAllNews(int languageId = 0, int storeId = 0,
int pageIndex = 0, int pageSize = int.MaxValue, bool showHidden = false)
{
var query = _newsItemRepository.Table;
if (!showHidden)
{
query = query.Where(n => n.Published);
}
query = query.OrderByDescending(n => n.CreatedOn);
var news = new PagedList<NewsItem>(query, pageIndex, pageSize);
return news;
}
/// <summary>
/// Inserts a news item
/// </summary>
/// <param name="news">News item</param>
public virtual void InsertNews(NewsItem news)
{
if (news == null)
throw new ArgumentNullException("news");
_newsItemRepository.Insert(news);
//event notification
_eventPublisher.EntityInserted(news);
}
/// <summary>
/// Updates the news item
/// </summary>
/// <param name="news">News item</param>
public virtual void UpdateNews(NewsItem news)
{
if (news == null)
throw new ArgumentNullException("news");
_newsItemRepository.Update(news);
//event notification
_eventPublisher.EntityUpdated(news);
}
/// <summary>
/// Gets news
/// </summary>
/// <param name="newsIds">The news identifiers</param>
/// <returns>News</returns>
public virtual IList<NewsItem> GetNewsByIds(int[] newsIds)
{
var query = _newsItemRepository.Table;
return query.Where(p => newsIds.Contains(p.Id)).ToList();
}
/// <summary>
/// Gets all comments
/// </summary>
/// <param name="customerId">Customer identifier; 0 to load all records</param>
/// <returns>Comments</returns>
public virtual IList<NewsComment> GetAllComments(int customerId)
{
var query = from c in _newsCommentRepository.Table
orderby c.CreatedOn
where (customerId == 0 || c.CustomerId == customerId)
select c;
var content = query.ToList();
return content;
}
/// <summary>
/// Gets a news comment
/// </summary>
/// <param name="newsCommentId">News comment identifier</param>
/// <returns>News comment</returns>
public virtual NewsComment GetNewsCommentById(int newsCommentId)
{
if (newsCommentId == 0)
return null;
return _newsCommentRepository.GetById(newsCommentId);
}
/// <summary>
/// Get news comments by identifiers
/// </summary>
/// <param name="commentIds">News comment identifiers</param>
/// <returns>News comments</returns>
public virtual IList<NewsComment> GetNewsCommentsByIds(int[] commentIds)
{
if (commentIds == null || commentIds.Length == 0)
return new List<NewsComment>();
var query = from nc in _newsCommentRepository.Table
where commentIds.Contains(nc.Id)
select nc;
var comments = query.ToList();
//sort by passed identifiers
var sortedComments = new List<NewsComment>();
foreach (int id in commentIds)
{
var comment = comments.Find(x => x.Id == id);
if (comment != null)
sortedComments.Add(comment);
}
return sortedComments;
}
/// <summary>
/// Deletes a news comments
/// </summary>
/// <param name="newsComments">News comments</param>
public virtual void DeleteNewsComments(IList<NewsComment> newsComments)
{
if (newsComments == null)
throw new ArgumentNullException("newsComments");
_newsCommentRepository.Delete(newsComments);
}
/// <summary>
/// 更新新闻评论
/// </summary>
/// <param name="newsComment"></param>
public virtual void UpdateNewsComment(NewsComment newsComment)
{
if (newsComment == null)
throw new ArgumentNullException("newsComment");
_newsCommentRepository.Update(newsComment);
//event notification
_eventPublisher.EntityUpdated(newsComment);
}
/// <summary>
/// Deletes a news comment
/// </summary>
/// <param name="newsComment">News comment</param>
public virtual void DeleteNewsComment(NewsComment newsComment)
{
if (newsComment == null)
throw new ArgumentNullException("newsComment");
_newsCommentRepository.Delete(newsComment);
}
public virtual IList<NewsItem> GetNewsByCategoryId(int categoryId, int pageSize = 4)
{
var query = (from x in _newsItemRepository.Table
where x.NewsCategoryId == categoryId
&& x.Published
orderby x.CreatedOn descending
select x).Take(pageSize).ToList();
return query;
}
public virtual PagedList<NewsComment> GetNewsCommentsByNewsId(int newsId, int pageIndex = 1, int pageSize = 5)
{
var query = from x in _newsCommentRepository.Table
where x.NewsItemId == newsId
&& !x.IsScreen
&& !x.IsPrize
orderby x.CreatedOn descending
select x;
return new PagedList<NewsComment>(query, pageIndex - 1, pageSize);
}
public virtual void ChangePrize(int newsId, int customerId, bool isPrize = true)
{
var news = GetNewsById(newsId);
if (null != news)
{
var comments = (from x in news.NewsComments
where x.NewsItemId == newsId
&& x.CustomerId == customerId
&& x.IsPrize
orderby x.CreatedOn descending
select x).FirstOrDefault();
if (isPrize)
{
if (null == comments)
{
news.NewsComments.Add(new NewsComment
{
NewsItemId = newsId,
CustomerId = customerId,
CreatedOn = DateTime.Now,
IsPrize = true
});
news.PrizeCount++;
}
}
else
{
if (null != comments)
{
//news.NewsComments.Remove(comments);
DeleteNewsComment(comments);
news.PrizeCount--;
}
}
UpdateNews(news);
}
}
public virtual bool AddNewsComment(int newsId, int customerId, string text, out string msg)
{
bool result = false;
var news = GetNewsById(newsId);
if (null != news)
{
var comments = (from x in news.NewsComments
where x.CustomerId == customerId
&& !x.IsPrize
orderby x.CreatedOn descending
select x).FirstOrDefault();
if (null != comments && comments.CreatedOn > DateTime.Now.AddMinutes(-1))
msg = "评论过于频繁";
else
{
news.NewsComments.Add(new NewsComment
{
NewsItemId = newsId,
CustomerId = customerId,
CommentText = text,
CreatedOn = DateTime.Now,
IsPrize = false,
IsScreen=true
});
msg = "评论成功,等待审核";
result = true;
news.CommentCount++;
UpdateNews(news);
}
}
else
{
msg = "新闻不存在";
result = false;
}
return result;
}
/// <summary>
/// 搜索所有的新闻
/// </summary>
/// <param name="dateFrom"></param>
/// <param name="dateTo"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="showHidden"></param>
/// <returns></returns>
public virtual IPagedList<NewsItem> GetAllNews(DateTime? dateFrom = null, DateTime? dateTo = null,
int pageIndex = 0, int pageSize = int.MaxValue, bool showHidden = false)
{
var query = _newsItemRepository.Table;
if (dateFrom.HasValue)
query = query.Where(c => dateFrom.Value <= c.CreatedOn);
if (dateTo.HasValue)
query = query.Where(c => dateTo.Value >= c.CreatedOn);
if (!showHidden)
{
query = query.Where(n => n.Published);
}
query = query.OrderByDescending(n => n.CreatedOn);
var news = new PagedList<NewsItem>(query, pageIndex, pageSize);
return news;
}
/// <summary>
/// 搜索所有的新闻评论
/// </summary>
/// <param name="dateFrom"></param>
/// <param name="dateTo"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="showHidden"></param>
/// <returns></returns>
public virtual IPagedList<NewsComment> GetAllComments(string commentContent=null,int pageIndex = 0, int pageSize = int.MaxValue)
{
var query = from c in _newsCommentRepository.Table
where (!string.IsNullOrEmpty(commentContent)&&c.CommentText.Contains(commentContent.Trim()))||(string.IsNullOrEmpty(commentContent))
orderby c.Id descending
select c;
//if (!showHidden)
//{
// query = query.Where(n => n.Published);
//}
return new PagedList<NewsComment>(query, pageIndex, pageSize);
}
#region News pictures
/// <summary>
/// Deletes a news picture
/// </summary>
/// <param name="newsPicture">News picture</param>
public virtual void DeleteNewsPicture(NewsPicture newsPicture)
{
if (newsPicture == null)
throw new ArgumentNullException("newsPicture");
_newsPictureRepository.Delete(newsPicture);
//event notification
_eventPublisher.EntityDeleted(newsPicture);
}
/// <summary>
/// Gets a news pictures by newsItem identifier
/// </summary>
/// <param name="newsItemId">The news identifier</param>
/// <returns>News pictures</returns>
public virtual IList<NewsPicture> GetNewsPicturesByNewsItemId(int newsItemId)
{
var query = from np in _newsPictureRepository.Table
where np.NewsItemId == newsItemId
orderby np.DisplayOrder
select np;
var newsItemPictures = query.ToList();
return newsItemPictures;
}
/// <summary>
/// Gets a newsItem picture
/// </summary>
/// <param name="newsItemIdPictureId">News picture identifier</param>
/// <returns>News picture</returns>
public virtual NewsPicture GetNewsPictureById(int newsPictureId)
{
if (newsPictureId == 0)
return null;
return _newsPictureRepository.GetById(newsPictureId);
}
/// <summary>
/// Inserts a newsItem picture
/// </summary>
/// <param name="newsPicture">News picture</param>
public virtual void InsertNewsPicture(NewsPicture newsPicture)
{
if (newsPicture == null)
throw new ArgumentNullException("newsPicture");
_newsPictureRepository.Insert(newsPicture);
//event notification
_eventPublisher.EntityInserted(newsPicture);
}
/// <summary>
/// Updates a newsItem picture
/// </summary>
/// <param name="newsPicture">News picture</param>
public virtual void UpdateNewsPicture(NewsPicture newsPicture)
{
if (newsPicture == null)
throw new ArgumentNullException("newsPicture");
_newsPictureRepository.Update(newsPicture);
//event notification
_eventPublisher.EntityUpdated(newsPicture);
}
/// <summary>
/// Get the IDs of all newsItem images
/// </summary>
/// <param name="NewsItemIds">News IDs</param>
/// <returns>All picture identifiers grouped by newsItem ID</returns>
public IDictionary<int, int[]> GetNewsItemsImagesIds(int[] newsItemsIds)
{
return _newsPictureRepository.Table.Where(p => newsItemsIds.Contains(p.NewsItemId))
.GroupBy(p => p.NewsItemId).ToDictionary(p => p.Key, p => p.Select(p1 => p1.PictureId).ToArray());
}
#endregion
#endregion
}
}
这上面都是自己写的一些常用的数据库交互方法。
系统最核心的还是它! ##IRepository
using System.Collections.Generic;
using System.Linq;
namespace Nop.Core.Data
{
/// <summary>
/// Repository
/// </summary>
public partial interface IRepository<T> where T : BaseEntity
{
/// <summary>
/// Get entity by identifier
/// </summary>
/// <param name="id">Identifier</param>
/// <returns>Entity</returns>
T GetById(object id);
/// <summary>
/// Insert entity
/// </summary>
/// <param name="entity">Entity</param>
void Insert(T entity);
/// <summary>
/// Insert entities
/// </summary>
/// <param name="entities">Entities</param>
void Insert(IEnumerable<T> entities);
/// <summary>
/// Update entity
/// </summary>
/// <param name="entity">Entity</param>
void Update(T entity);
/// <summary>
/// Update entities
/// </summary>
/// <param name="entities">Entities</param>
void Update(IEnumerable<T> entities);
/// <summary>
/// Delete entity
/// </summary>
/// <param name="entity">Entity</param>
void Delete(T entity);
/// <summary>
/// Delete entities
/// </summary>
/// <param name="entities">Entities</param>
void Delete(IEnumerable<T> entities);
/// <summary>
/// Gets a table
/// </summary>
IQueryable<T> Table { get; }
/// <summary>
/// Gets a table with "no tracking" enabled (EF feature) Use it only when you load record(s) only for read-only operations
/// </summary>
IQueryable<T> TableNoTracking { get; }
}
}
为了处理,获取的数据,还需要定义个常用的Model模型来存储数据,这个真心的蛋疼。
using Nop.Web.Framework.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Nop.Web.Models.News
{
public partial class AppNewsModel
{
public AppNewsModel()
{
this.News = new List<NewsModel>();
}
public bool result { get; set; }
public string msg { get; set; }
public List<NewsModel> News { get; set; }
}
/// <summary>
/// 新闻
/// </summary>
public partial class NewsModel : BaseNopEntityModel
{
public NewsModel()
{
this.CoverImgUrls = new List<string>();
}
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 概要
/// </summary>
public string Short { get; set; }
/// <summary>
/// 详情(新闻列表不传该字段)
/// </summary>
public string Full { get; set; }
/// <summary>
/// 允许评论
/// </summary>
public bool AllowComments { get; set; }
/// <summary>
/// 评论量
/// </summary>
public int CommentCount { get; set; }
/// <summary>
/// 点赞量
/// </summary>
public int PrizeCount { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public string CreatedOn { get; set; }
/// <summary>
/// 赞
/// </summary>
public bool IsPrize { get; set; }
/// <summary>
/// 点击数量
/// </summary>
public int ClickCount { get; set; }
public List<string> CoverImgUrls { get; set; }
}
}
基本上,还是很清晰的。就跟王者荣耀游戏一样,玩几局,就摸透了。
F12定位恒好用。
浅析.Net数据操作机制的更多相关文章
- 探索 OpenStack 之(17):计量模块 Ceilometer 中的数据收集机制
本文将阐述 Ceilometer 中的数据收集机制.Ceilometer 使用三种机制来收集数据: Notifications:Ceilometer 接收 OpenStack 其它服务发出的 noti ...
- 浅析MySQL数据碎片的产生(data free)
浅析MySQL数据碎片的产生 2011-03-30 09:28 核子可乐译 51CTO 字号:T | T MySQL列表,包括MyISAM和InnoDB这两种最常见的类型,而根据经验来说,其碎片的产生 ...
- Spark Streaming揭秘 Day16 数据清理机制
Spark Streaming揭秘 Day16 数据清理机制 今天主要来讲下Spark的数据清理机制,我们都知道,Spark是运行在jvm上的,虽然jvm本身就有对象的自动回收工作,但是,如果自己不进 ...
- 用Python浅析股票数据
用Python浅析股票数据 本文将使用Python来可视化股票数据,比如绘制K线图,并且探究各项指标的含义和关系,最后使用移动平均线方法初探投资策略. 数据导入 这里将股票数据存储在stockData ...
- Salesforce的数据权限机制
本文主要介绍了 Salesforce 对于系统中数据的访问控制是如何设计的,然后也了解了下 Alfresco 和 Oracle VPD 的数据权限机制.希望对一些业务系统的数据权限的访问控制设计能有所 ...
- MySQL库操作,表操作,数据操作。
数据库服务器:本质就是一台计算机,该计算机上安装有数据库管理软件的服务端,供客户端访问使用. 1数据库管理系统RDBMS(本质就是一个C/S架构的套接字),关系型数据库管理系统. 库:(文件夹)- ...
- Android 建立手机与手表数据同步机制总结
Android Wear 数据同步机制总结 当手机与手表建立蓝牙连接之后.数据就能够通过Google Play Service进行传输. 同步数据对象Data Item DataItem提供手机与手表 ...
- redis常见数据操作
redis中有5种常见的数据类型,针对这5种数据类型有着相应的数据操作. 1.String(键值对为String - String) set k1 v1 get k1 getset k1 v1 - h ...
- 16.Spark Streaming源码解读之数据清理机制解析
原创文章,转载请注明:转载自 听风居士博客(http://www.cnblogs.com/zhouyf/) 本期内容: 一.Spark Streaming 数据清理总览 二.Spark Streami ...
随机推荐
- Xrdp - 通过Windows的RDP连接Linux远程桌面(Ubuntu/CentOS/Redhat 7)(转载)
您多久访问一次Linux桌面? 您使用什么工具来访问远程桌面? Xrdp是一个开源工具,允许用户通过Windows RDP访问Linux远程桌面. 除了Windows RDP之外,xr ...
- CF85E Guard Towers(二分答案+二分图)
题意 已知 N 座塔的坐标,N≤5000 把它们分成两组,使得同组内的两座塔的曼哈顿距离最大值最小 在此前提下求出有多少种分组方案 mod 109+7 题解 二分答案 mid 曼哈顿距离 >mi ...
- Raspberry Pi - 调整你的SD卡分割区的大小
在使用Win32DiskImager为一张空白的SD卡刷入新的Rasbian系统后,卡上的可用剩余空间并不大, 本人有一张8G的SD卡,但是刷入4.1的Rasbian后,用df -h查看,根目录下的空 ...
- 题解 P2872 【[USACO07DEC]道路建设Building Roads】
这道题真的是令人窒息,Kruskal调了贼久一直RE,最后发现数组大小稍微少了那么一点点.(也就10倍吧..) 言归正传,根据本人的分析(以及算法标签的提示),这是一道求最小生成树的题目,当然要注意已 ...
- ECNUOJ 2149 华丽的队列
华丽的队列 Time Limit:3000MS Memory Limit:65536KBTotal Submit:531 Accepted:68 Description 每年,都有很多新同学来到我们 ...
- Vs2012在Linux开发中的应用(1):开发环境
在Linux的开发过程中使用过多个IDE.code::blocks.eclipse.source insight.还有嵌入式厂商提供的各种IDE.如VisualDsp等,感觉总是不如vs强大好用.尽管 ...
- c3p0出现 An attempt by a client to checkout a Connection has timed out
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out. at com.mchange ...
- OpenCV图像处理篇之边缘检測算子
3种边缘检測算子 灰度或结构等信息的突变位置是图像的边缘,图像的边缘有幅度和方向属性.沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈.因此,边缘上的变化能通过梯度计算出来. 一阶导数的梯度算子 对于 ...
- POJ 1611 The Suspects 并查集 Union Find
本题也是个标准的并查集题解. 操作完并查集之后,就是要找和0节点在同一个集合的元素有多少. 注意这个操作,须要先找到0的父母节点.然后查找有多少个节点的额父母节点和0的父母节点同样. 这个时候须要对每 ...
- 1.windows编程常用
1.画线 HDC hdc; hdc = ::GetDC(m_hWnd); ::MoveToEx(hdc, , , NULL); ::LineTo(hdc, , ); 2.填充矩形 HDC hdc; h ...