表结构是这样的,三个表,文章表Article,标签表Tag,中间表TagArticle
Article
ID Title ……
Tag
ID Name
TagArticle
TagID ArticleID
我的问题是在MVC 3 中,调用文章列表,如何能把标签调用出来
像这样:
ID 标题 标签
23 文章标题 娱乐,电影
自己解决了,主要参考了这两篇文章:
http://www.cnblogs.com/dudu/archive/2011/07/09/entity_framework_many_to_many.html
http://www.cnblogs.com/artwl/archive/2011/11/03/2234359.html
核心的代码如下:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Article>()
.HasMany(t => t.Tag)
.WithMany(s => s.Article)
.Map
(
m =>
{
m.MapLeftKey("ArticleID");
m.MapRightKey("TagID");
m.ToTable("TagArticles");
}
);
base.OnModelCreating(modelBuilder);
}
ArticleModel中:
public ICollection<Tag> Tag { get; set; }
TagModel中:
public ICollection<Shop> Shop { get; set; }
Controller中:
var article = db.Article.Include(t=>t.Tag).ToList();
Views中:
@foreach (var itemTags in item.Tag)
{
@itemTags.Name
}
楼主直管下sql就是了多表关联取得自己想要的栏位 主要的就是要把你需要的栏位组成一个泛型 在view页面展示泛型
麻烦能详细说下吗,sql应该怎么写,还有怎么组成一个泛型,并且在view页怎么写,在view页需要引入哪个model。
@ykren:
SELECT Article.ID ,Article.Title ,Tag.Name FROM Article LEFT JOIN TagArticle ON TagArticle.ArticleID = Article.ID LEFT JOIN Tag ON Tag.ID= TagArticle.TagID
以上是SQL
你通过ADO.Net 执行sql 返回 DataReader DataReader填充到IList<XXX>泛型
public class XXX { public string ID{get;set;} public string Title{get;set;} public string Name{get;set;} }
在COntroller传给相应的VIew页面
在VIew页面 Aspx视图的话 <% foreach(var item in Model)
Rezor视图@foreach(var item in Model)
@sym_cn: 我之前就是写了个类似你写的sql,但是后来觉得这样不妥。既然用mvc了,就不要硬邦邦地写sql了,以及用ado.net了,还是用ef比较好。即使退一步讲,像你这么做的话我也有疑问:你的Model对应的是哪个?Article?还是Tag?所以你的foreach循环怎么能读到每条文章对应的tag呢?
@ykren: MVC 并不是解决我们数据底层如何处理的。 至于用什么访问数据库,因地制宜。Model这三个实体类都不对应 我写的那个实体类是对应的数据返回, 以及绑定到View页面的Model。 是ViewModel。
MVC与Ado.Net没有什么关系。好吧暂且不讨论这个。 就用EF EF 也是要写类似的关联LINQ语句 查出你想要的栏位 储存到 一个新的实体类里面 存到实体类之后接下来的动作都是一些样的。
1 //实现所有信息的显示和条件查询 2 public ActionResult LoadAllByPage(int page, int rows, string order, string sort, string statuss) 3 { 4 bll(); 5 long total = 0; 6 //Select将序列中的每一个新元素投影到新表中 7 //var list = this.RoleService.LoadAllByPage(out total, page, rows, order, sort, statuss).Select(entity => new 8 //{ 9 // entity.roleID, 10 // entity.roleName, 11 // entity.status 12 //}); 13 List<Role> listnew = this.RoleService.LoadAllByPage(out total, page, rows, order, sort, statuss).ToList(); 14 List<Role> list = new List<Role> { }; 15 for (int i = 0; i < total; i++) 16 { 17 Role role = listnew[i]; 18 if (role.status) 19 { 20 role.statusstr = "激活"; 21 } 22 else 23 { 24 role.statusstr = "禁用"; 25 } 26 list.Add(new Role { roleID = role.roleID, roleName = role.roleName, status = role.status, statusstr = role.statusstr }); 27 } 28 var result = new { total = total, rows = list.ToList() }; 29 return Json(result); 30 }
这应该是两张表的级联,可以参考以下的!
这个例子和我的需求不太一样。
对于你这个例子我还有些另外的问题探讨一下:你这个是返回json的,如果不是返回json的,直接返回给view的,那在view中要怎么读出来呢?通常在mvc的view中需要引入model的,你这个引入哪个model呢?需要另写一个viewmodel吗?
@ykren: 是的,你需要另外写一个Modle。但如果你用的是ORM框架,不用写也可以
楼主,首先建一个MOdel,有你要的三个表的字段。然后再service里写查询数据的方法,把三个表的内容赋值给Model(这方法应该会写吧,不会写就说),然后再控制器里调用这个方法,返回return View(model)(变量mode是service方法的返回值,这个应该会的吧l);。最后在页面上:你是一个文章的列表,那么应该是list<model>。显示要用个循环:
for(var item in MOdel){
<tr>
<td>
文章ID
</td>
@item.ID
<td>
文章标题
</td>
<td>
@item.标题
</td>
</tr>
}
基本就这样了。
直接写个视图把这3表关联了,查询的时候只查询这个视图名就ok了
用视图的目的是什么?如果用视图何不直接用楼上sym_cn的sql语句多直接?我的问题不是如何取出这些数据,是如何在view中读出来,毕竟mvc和用控件的asp.net是不一样的。
@ykren: 楼主, 你误解wydycg的意思了 他意思是你建立一个VIew 可以直接在EF里面用。 这样既省了创建聚合视图 又可以直接作为一个对象在VIew页面循环
同样建议使用视图
我晕,楼上各位都讲的那么详细了。。。。
你应该有三个表对应的Model吧,可以写个聚合Model——即其中包含三个属性分别是三个表对应的Model类型,View中再呈现此聚合Model,或者用楼上说的方法:用视图!
聚合Model?这个不懂,能否详细说说。
建议使用视图实体,也就是新建一个实体类,里面添加需要的字段及对应的类型,查询的时候使用linq的select来影射成集合再去前台显示就可以了。