C# 将数据从单独的表添加到MVC视图
我对MVC很陌生,请原谅我对它不熟悉 我正在试验一个项目,遇到了以下问题:如果没有通过外键关系连接,如何从单独的数据库表中引入数据 我有一个表,其中一列可能与另一个表中的值匹配,也可能与另一个表中的值不匹配,如果匹配,我需要对其进行标记 例如: 简单来说,有一个表愿望列表和一个表填充存储,它们有以下字段:C# 将数据从单独的表添加到MVC视图,c#,entity-framework,relational-database,C#,Entity Framework,Relational Database,我对MVC很陌生,请原谅我对它不熟悉 我正在试验一个项目,遇到了以下问题:如果没有通过外键关系连接,如何从单独的数据库表中引入数据 我有一个表,其中一列可能与另一个表中的值匹配,也可能与另一个表中的值不匹配,如果匹配,我需要对其进行标记 例如: 简单来说,有一个表愿望列表和一个表填充存储,它们有以下字段: StuffAtStore Price Name Wishlist Name Person 我想列出StuffAtStore中的所有项目,如果有,则StuffAtStore.
StuffAtStore
Price
Name
Wishlist
Name
Person
我想列出StuffAtStore中的所有项目,如果有,则StuffAtStore.Name==Wishlist.Name我想在价格后添加文本“On”+Wishlist.Person+“'s Wishlist”
根据我在网上找到的一些建议,我能做的就是创造这样的东西
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 "";
}
}
}
}
及
但这自然是非常非常缓慢的
用MVC实现这一点的最佳/最合适的方法是什么?这实际上不是MVC的问题,而是如何高效地检索数据的问题 看起来您正在使用实体框架。即使在StuffAtStore和Wishlist之间没有数据库级外键,您仍然可以在EF中创建这两个实体之间的关系。然后,在检索StuffAtStore时,您可以简单地包含愿望列表。如果愿望列表不包含该项目,则集合将为空
话虽如此,如果您的愿望列表项确实是存储项,您可能应该回到数据库设计,在这些表之间使用外键,而不是尝试通过任意名称列连接它们。也许您可以为视图创建一个
视图模型。实际上,它是一个简单的类,您可以从控制器向视图提供,并在您的内部声明一些成员(例如,一个列表
,它将包含要显示的已准备好的字符串)和一个构造函数,该构造函数将使用表之间的联接进行查询(实际上是一个左联接)
我认为ViewModels
(与MVVM模式不同,但几乎相同)是向视图呈现复杂数据结构的最佳方式,如果您的基类(您的模型
)不太适合,那么它会变得非常简单
这里有一些很好的教程:
你应该考虑一个VIEW模型类,比如:
class StuffViewModel {
string Name { get; set; }
string Price { get; set; }
string PersonIfAny { get; set; }
}
然后,在您的控制器/操作中
:
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);
}
这似乎更像是一个数据库问题,而不是MVC
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);
}