ASP.NET MVC 4加入两个表

时间:2013-08-05 07:48:52

标签: c# entity-framework asp.net-mvc-4

请你看看我的代码并指出我正确的方向。 我有2个表:Product和vProductAndDescription。我需要Product中的Name和LisPrice以及分别通过其ProductID连接的vProductAndDescription的描述。在我看来,我是否正确地实现了这一目标?因为到目前为止它只是崩溃。

控制器:

public ActionResult Index()
        {
            string query = "SELECT v.Name, p.ListPrice, LEFT(v.Description, 20) from SalesLT.vProductAndDescription v, SalesLT.Product p WHERE v.ProductID = p.ProductID";
            var list = db.Database.SqlQuery<Product>(query);              
            var result = from a in list.ToList()
                    join b in db.vProductAndDescriptions on a.ProductID equals b.ProductID
                    select new
                    {
                        c = a.Name,
                        d = a.ListPrice,
                        e = b.Description
                    };
            return View(result.ToList());
}

查看:

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<table>
    <tr>
        <th>Name
        </th>
        <th>Price (R)
        </th>
        <th>Description
        </th>
        <th></th>
    </tr>

@foreach (var item in ViewData.Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ListPrice)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Description)
        </td>
    </tr>
}
</table>

1 个答案:

答案 0 :(得分:2)

您的电话var list = db.Database.SqlQuery<Product>(query);尝试创建类型为Product的列表但您的实际查询未返回创建ProductID类型所需的Product参数。此外,您期望从线

中选择什么类型
var result = from a in list.ToList()
                join b in db.vProductAndDescriptions on a.ProductID equals b.ProductID
                select new
                {
                    c = a.Name,
                    d = a.ListPrice,
                    e = b.Description
                };

首先,您需要一个ViewModel来保存您的值,因为您没有将整个现有对象传递给您的视图。

public class ProductDescriptionsViewModel {
    public string Name {get;set;}
    public string ListPrice {get;set;}
    public string Description {get;set;}
}

位于顶部的查看代码中:

@model IEnumerable<YourFullNamespace.ProductDescriptionsViewModel>

在您的查询中,您实际上正在对数据库进行2次调用,让我们看看是否可以重新安排事情来接听一个电话:

string query = "SELECT v.Name as Name, p.ListPrice as ListPrice, LEFT(v.Description, 20) as Description from SalesLT.vProductAndDescription v, SalesLT.Product p WHERE v.ProductID = p.ProductID";
var viewModel = db.Database.SqlQuery<ProductDescriptionsViewModel>(query);