Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数据从单独的表添加到MVC视图_C#_Entity Framework_Relational Database - Fatal编程技术网

C# 将数据从单独的表添加到MVC视图

C# 将数据从单独的表添加到MVC视图,c#,entity-framework,relational-database,C#,Entity Framework,Relational Database,我对MVC很陌生,请原谅我对它不熟悉 我正在试验一个项目,遇到了以下问题:如果没有通过外键关系连接,如何从单独的数据库表中引入数据 我有一个表,其中一列可能与另一个表中的值匹配,也可能与另一个表中的值不匹配,如果匹配,我需要对其进行标记 例如: 简单来说,有一个表愿望列表和一个表填充存储,它们有以下字段: StuffAtStore Price Name Wishlist Name Person 我想列出StuffAtStore中的所有项目,如果有,则StuffAtStore.

我对MVC很陌生,请原谅我对它不熟悉

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

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

例如:

简单来说,有一个表愿望列表和一个表填充存储,它们有以下字段:

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

}