我对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执行此操作的最佳/最佳方式是什么?
答案 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);
}