首页 新闻 会员 周边

最近在搞mvc,关于多对多数据如何提取的问题,搞了两个晚上也没搞出来

0
悬赏园豆:100 [已解决问题] 解决于 2012-10-31 10:30

表结构是这样的,三个表,文章表Article,标签表Tag,中间表TagArticle

Article

ID   Title   ……

Tag

ID    Name

TagArticle
TagID    ArticleID   

 

我的问题是在MVC 3 中,调用文章列表,如何能把标签调用出来

像这样:

ID    标题                                                        标签

23    文章标题                                                  娱乐,电影

ykren的主页 ykren | 初学一级 | 园豆:114
提问于:2012-10-28 00:15
< >
分享
最佳答案
0

自己解决了,主要参考了这两篇文章:

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
                            }

ykren | 初学一级 |园豆:114 | 2012-10-30 21:14
其他回答(8)
0

楼主直管下sql就是了多表关联取得自己想要的栏位 主要的就是要把你需要的栏位组成一个泛型 在view页面展示泛型

收获园豆:50
sym_cn | 园豆:798 (小虾三级) | 2012-10-28 01:18

麻烦能详细说下吗,sql应该怎么写,还有怎么组成一个泛型,并且在view页怎么写,在view页需要引入哪个model。

支持(0) 反对(0) ykren | 园豆:114 (初学一级) | 2012-10-28 10:12

@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)

支持(0) 反对(0) sym_cn | 园豆:798 (小虾三级) | 2012-10-29 09:40

@sym_cn: 我之前就是写了个类似你写的sql,但是后来觉得这样不妥。既然用mvc了,就不要硬邦邦地写sql了,以及用ado.net了,还是用ef比较好。即使退一步讲,像你这么做的话我也有疑问:你的Model对应的是哪个?Article?还是Tag?所以你的foreach循环怎么能读到每条文章对应的tag呢?

支持(0) 反对(0) ykren | 园豆:114 (初学一级) | 2012-10-30 20:53

@ykren: MVC 并不是解决我们数据底层如何处理的。 至于用什么访问数据库,因地制宜。Model这三个实体类都不对应  我写的那个实体类是对应的数据返回, 以及绑定到View页面的Model。  是ViewModel。

MVC与Ado.Net没有什么关系。好吧暂且不讨论这个。 就用EF   EF 也是要写类似的关联LINQ语句 查出你想要的栏位 储存到 一个新的实体类里面   存到实体类之后接下来的动作都是一些样的。  

支持(0) 反对(0) sym_cn | 园豆:798 (小虾三级) | 2012-10-31 10:27
0
 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         }

这应该是两张表的级联,可以参考以下的!
收获园豆:10
Kencery | 园豆:357 (菜鸟二级) | 2012-10-28 07:12

这个例子和我的需求不太一样。
对于你这个例子我还有些另外的问题探讨一下:你这个是返回json的,如果不是返回json的,直接返回给view的,那在view中要怎么读出来呢?通常在mvc的view中需要引入model的,你这个引入哪个model呢?需要另写一个viewmodel吗?

支持(0) 反对(0) ykren | 园豆:114 (初学一级) | 2012-10-28 10:00

@ykren: 是的,你需要另外写一个Modle。但如果你用的是ORM框架,不用写也可以

支持(0) 反对(0) woaibaojinyuan | 园豆:214 (菜鸟二级) | 2012-10-28 18:56
0

楼主,首先建一个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>

}

基本就这样了。

收获园豆:10
学学学习 | 园豆:427 (菜鸟二级) | 2012-10-28 19:04
0

直接写个视图把这3表关联了,查询的时候只查询这个视图名就ok了

收获园豆:10
jason2013 | 园豆:1998 (小虾三级) | 2012-10-29 08:43

用视图的目的是什么?如果用视图何不直接用楼上sym_cn的sql语句多直接?我的问题不是如何取出这些数据,是如何在view中读出来,毕竟mvc和用控件的asp.net是不一样的。

支持(0) 反对(0) ykren | 园豆:114 (初学一级) | 2012-10-30 21:00

@ykren: 楼主, 你误解wydycg的意思了   他意思是你建立一个VIew 可以直接在EF里面用。  这样既省了创建聚合视图 又可以直接作为一个对象在VIew页面循环

支持(0) 反对(0) sym_cn | 园豆:798 (小虾三级) | 2012-10-31 10:37
0

同样建议使用视图

ms_water | 园豆:510 (小虾三级) | 2012-10-29 09:44
0

我晕,楼上各位都讲的那么详细了。。。。

帝之晓 | 园豆:98 (初学一级) | 2012-10-29 19:38
0

    你应该有三个表对应的Model吧,可以写个聚合Model——即其中包含三个属性分别是三个表对应的Model类型,View中再呈现此聚合Model,或者用楼上说的方法:用视图!

收获园豆:10
know-more | 园豆:106 (初学一级) | 2012-10-30 10:32

聚合Model?这个不懂,能否详细说说。

支持(0) 反对(0) ykren | 园豆:114 (初学一级) | 2012-10-30 21:01
0

建议使用视图实体,也就是新建一个实体类,里面添加需要的字段及对应的类型,查询的时候使用linq的select来影射成集合再去前台显示就可以了。

收获园豆:10
邹华栋 | 园豆:209 (菜鸟二级) | 2012-10-30 11:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册