MVC多表联合查询数据显示
随然做过几年.net开发,但一直没有做过MVC框架下的网站,这段时间无事,学习一下。下面的方法是我摸索过程中的一点总结,如果有更好的方法,欢迎告诉我,谢谢。
这段时间我只看了MVC和LinQ两本书,关于EF我是没看的,所以我的这个网站的数据层打算直接使用LinQ完成。今天准备开发了,才发现读数据是个问题,汗呀~~~
现在总结两种方法:
1.手写实体对象。
思路:写一个包含所有字段属性的实体类对象,使用LinQ将数据查询出后,经过一个转换器将数据转换为IList<T>类型,返回给视图显示。
1.实体类对象。
public class IndexAtriclList
{
/// <summary>
/// 主键ID
/// </summary>
public int ID { get; set; }
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 创建人
/// </summary>
public string UserName { get; set; }
}
2.读取数据。
DataClasses1DataContext context=new DataClasses1DataContext();
//方法1
var query = from a in context.GetTable<Articles>()
join m in context.GetTable<Members>()
on a.AutherID equals m.ID
orderby a.CreateTime
select new IndexAtriclList { ID = a.ID, Title = a.Title, CreateTime = a.CreateTime, UserName = m.UserName };
var list = Common.ToList<IndexAtriclList>(query);
return View(list);
上面这段代码中DataClasses1DataContext是LinQ To SQL设计器自动生成的代码,包括了DataContext对象及所有数据表映射。
Common.ToList是我写的一个转换器,下面会说到。
Articles,Members是LinQ的数据表映射,IndexAtriclList是第1步生成的实体对象。
3.转换数据
public class Common {
public static List<T> ToList<T>(IEnumerable<T> data) {
List<T> list=new List<T>();
var propertys = System.ComponentModel.TypeDescriptor.GetProperties(typeof(T));
foreach (var item in data)
{
T t = Activator.CreateInstance<T>();
Type type = t.GetType();
foreach (System.ComponentModel.PropertyDescriptor p in propertys) {
object o=p.GetValue(item);
t.GetType().GetProperty(p.Name).SetValue(t, o, null);
}
list.Add(t);
}
return list;
}
}
这里我用到了泛型,想的是方法的复用,主要是想省事。
4.视图显示
@model IList<IndexAtriclList> <h2>Index</h2>
<table border="">
<thead>
<tr>
<td>标题</td>
<td>发布日期</td>
</tr>
</thead>
@{ foreach (var item in Model)
{
<tr>
<td>@item.Title</td>
<td>@item.CreateTime</td>
</tr>
}
}
</table>
ok,到这里第一种方法完成。但是我还没想明白,如果这么做的话,手写及维护实例类就是一项艰巨的工作,不知是我的思路不对,还是有更好的方法,希望大家指正。
2.存储过程
思路:在sql server中写一个返回结果集的存储过程,LinQ直接调用即可。(这个方法真是太方便了,两分钟搞写)
1.在Sql Server中写存储过程
Create proc IndexArticleList
as
select a.ID,Title,a.CreateTime,m.UserName from Articles a
inner join Members m on a.AutherID=m.ID
go
2.调用存储过程
DataClasses1DataContext context = new DataClasses1DataContext();
//方法2
var list = context.IndexArticleList().ToList();
return View(list);
3.视图显示,方法同第1种方法。
这个方法不用我们维护实体类,LinQ会根据存储过程自动生成对应的类。我们可以在LinQ的designer.cs上看到生成的对象。
public partial class IndexArticleListResult
{ private int _ID; private string _Title; private System.DateTime _CreateTime; private string _UserName; public IndexArticleListResult()
{
} [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ID", DbType="Int NOT NULL")]
public int ID
{
get
{
return this._ID;
}
set
{
if ((this._ID != value))
{
this._ID = value;
}
}
}
......................
如果有一个复杂的查询逻辑,我们可以写在存储过程中,提升性能。
我在测试当中,发现LinQ对返回多结果集的存储过程支持并不好,每次辛辛苦苦改了LinQ的映射文件,一刷新又变回去了。不知道该说什么了。关于返回多结果集的方法,我会在下一篇中总结。
MVC多表联合查询数据显示的更多相关文章
- MVC5+EF6简单实例---以原有SQLServer数据库两表联合查询为例
有二三年没写代码了,**内的工作就是这样,容易废人!看到园子里这么多大侠朝气蓬勃的,我想也要学点东西并和大家分享,共同进步!快乐每一天,进步每一天!言归正传! 通过最近一段时间对MVC5.EF6的学习 ...
- MyBatis 多表联合查询及优化 以及自定义返回结果集
下面就来说一下 mybatis 是通过什么来实现多表联合查询的.首先看一下表关系,如图: 这 里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了 ...
- yii 多表联合查询的几种方法
yii多表联合查询, 第一种,用command,自己拼接sql语句执行查询 第二种,用AR,model需继承下面的ar,执行queryall或queryrow方法 <?php //applica ...
- Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新
CrmFetchKit.js是一个跨浏览器的一个类库,允许通过JavaScript来执行fetch xml的查询,还可以实现批量更新,分页查询等.目前已支持Chrome 25, Firefox 19 ...
- SharePoint 2013 列表多表联合查询
在SharePoint的企业应用中,遇到复杂的逻辑的时候,我们会需要多表查询:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,需要使用SPQuery的Joins ...
- 一步步学Mybatis-实现多表联合查询(4)
上一章节中我们已经完成了对单表的CRUD操作,接下来今天这一讲讲述的是关于Mybatis在多表查询时候的应用,毕竟实际业务中也是多表的联合查询比较多嘛~ 还记得最一开始我们新建过一张Website表吗 ...
- MyBatis之三:多表联合查询
在这篇文章里面主要讲解如何在mybatis里面使用一对一.一对多.多表联合查询(类似视图)操作的例子. 注:阅读本文前请先大概看一下之前两篇文章. 一.表结构 班级表class,学生表student, ...
- MyBatis 多表联合查询,字段重复的解决方法
MyBatis 多表联合查询,两张表中字段重复时,在配置文件中,sql语句联合查询时使用字段别名,resultMap中对应的column属性使用相应的别名: <resultMap type=&q ...
- ormlite 多表联合查询
ormlite 多表联合查询 QueryBuilder shopBrandQueryBuilder = shopBrandDao.queryBuilder(); QueryBuilder shopQu ...
随机推荐
- TCP粘包分析与处理
http://www.cnblogs.com/liyux/p/5594423.html http://www.cnblogs.com/liyux/p/5603826.html
- 【转】Logistic regression (逻辑回归) 概述
Logistic regression (逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性.比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等 ...
- 利用freopen()函数和fc命令简化程序调试
大家在参加ACM比赛或者参加c/c++实验技能竞赛的时候,如果遇到大量的输入和大量的输出时,调试起来很不方便.一来如果结果不正确的话,需要重复输入大量数据:二来如果大量输出的话,得仔细检查输出结果与正 ...
- AngularJs(七) 模块的创建
module 目前我选编写的都是在AngularJs-1.5版本,如有疑问可以联系我. 理解模块的生命周期. config 和 run 方法是模块调用时加载的方法.那么module的执行顺序是怎么样呢 ...
- php什么是变量的数据类型
什么是变量的数据类型 在变量中,由于变量占用的空间单元不一样(占的地盘大小不一样),也分成几种数据类型,就像超市商品的包装袋,有几种不同类型,不同的商品使用不同的包装袋.我们可以通过使用“memory ...
- 自定义构造方法和description方法
知识回顾在第5讲中已经介绍了如何定义类和创建并初始化对象,比如有Student这个类1.Student.h 1 #import <Foundation/Foundation.h>23@in ...
- static和extern关键字 对变量的作用
本文目录 • 一.在Java中,全局变量的定义没有严格的位置规定 • 二.在C语言中,全局变量定义的位置是有限制的 • 三.重复定义同一个变量 • 四.不同源文件中的同名变量 • 五.static关键 ...
- JAVA反射系列之Field,java.lang.reflect.Field使用获取方法
JAVA反射系列之Field,java.lang.reflect.Field使用获取方法. 转载https://my.oschina.net/u/1407116/blog/209383 摘要 ja ...
- UIWebViewでローカルにあるHTMLを表示する&iOS6からtextAlignmentで指定する値が変更になった
[objective-c]UIWebViewでローカルにあるHTMLを表示する xcode内にHTMLを格納して.そのHTMLをWebViewで表示する方法です. // UIWebViewの初期化UI ...
- MarkWord
MarkWord - 可发布博客的 Markdown编辑器 代码开源 1 /// <summary> 2 /// 同步呈现 3 /// </summary> 4 /// < ...