从单独的表向MVC视图添加数据

时间:2014-04-10 16:56:23

标签: c# entity-framework relational-database

我对MVC很陌生,所以原谅我对它的不熟悉。

我正在尝试一个项目,并且我遇到了以下问题:如果没有通过外键关系连接,如何从单独的数据库表中引入数据。< / p>

我有一个表,其中一列可能与另一个表中的值匹配,也可能不匹配,如果是,我需要标记它。

示例:

让我们说,为了简单起见,我们有一个Wishlist表和一个StuffAtStore表,他们有这些字段:

StuffAtStore
  Price
  Name

Wishlist
  Name
  Person

我想列出StuffAtStore中的所有项目,如果有的话,那么StuffAtStore.Name == Wishlist.Name我想添加文本&#34;在&#34; + Wishlist.Person +&#34;的愿望清单&#34;价格之后。

基于我在网上找到的一些建议,我可以开始工作的是创造这样的东西

public partial class StuffAtStore
{
    public string PersonIfAny 
    {
        get
        {
            FooEntities db = new FooEntities();

            if (db.Wishlist.Any(w => w.Name == Name))
            {
                return db.Wishlist.First(w => w.Name == Name).Person;
            }
            else
            {
                return "";
            }
        }
    }
}

@Html.DisplayFor(modelItem => item.Price)

@if (item.PersonIfAny != "")
{
    @Html.PersonIfAny(modelItem => item.PersonIfAny) 
}

但自然这很慢。

使用MVC执行此操作的最佳/最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

这真的不是一个MVC问题,而是一个如何以有效的方式检索数据的问题。

看起来你正在使用Entity Framework。即使StuffAtStore和Wishlist之间没有数据库级外键,您仍然可以在EF中创建这两个实体之间的关系。然后,当检索StuffAtStore时,您可以简单地包含愿望清单。如果愿望清单不包含该项目,则该集合将为空。

话虽如此,如果你的wishlist项目确实是商店项目,你应该可以一直回到你的数据库设计,并在这些表之间有一个外键,而不是试图通过任意名称列连接它们。

答案 1 :(得分:0)

也许你可以为你的观点制作ViewModel。实际上,它是一个简单的类,你从你的控制器给你的视图,并在你声明一些成员(例如,一个List<string>,将包含你已经准备好的字符串显示)和一个构造函数,将使用在表之间加入(实际上是左连接)。

我认为ViewModels(不像MVVM模式中那样,但差不多)是向您的视图呈现复杂数据结构的最佳方式,如果您的基类(Model使其更加简单})不适合完美。

以下是一些很好的教程:http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-3

答案 2 :(得分:0)

您应该考虑使用如下的ViewModel类:

class StuffViewModel {
    string Name { get; set; }
    string Price { get; set; }
    string PersonIfAny { get; set; }
}

然后,在Controller/Action中:

void YourAction(...) {
    FooEntities db = new FooEntities();
    var stuff = db.StuffAtStore.Select(s => 
        new StuffViewModel
        {
            Name = s.Name,
            Price = s.Price,

            // This will use Outer Apply, which may not be available
            // for EF providers other than Microsoft's MSSQL provider.
            PersonIfAny = db.Wishlist.Where(w => w.Name == s.Name)
                            .Select(w => w.Person).FirstOrDefault();
        }

    foreach(var s : stuff) 
    {
        s.PersonIfAny = s.PersonIfAny ?? "";
    }


    return View(stuff);

}