尝试将我的LINQ查询呈现为剃刀视图

时间:2017-05-07 00:17:29

标签: asp.net razor

晚上好。

我在三个表之间创建了一个连接,其中一个是联结表。 我使用LinqPad和Linquer的组合来测试我的LINQ查询。 我的C#代码没有生成错误,我的两个项目字段(Product_ID,Title)被渲染得很好。 我想做的是用剃刀渲染另一个表(tblAuthor.FirstName)中的内容。

// GET: TestProducts
public ActionResult Index()
    {
        var products = (from pd in db.tblProducts
                 join od in db.tblAuthorProducts on pd.Product_ID equals od.Product_ID
                 orderby pd.Product_ID
                 select new
                 {
                     pd.Title,
                     pd.Description,
                     pd.Start_FY,
                     pd.ProductType,
                     od.tblAuthor.FirstName,
                     od.tblAuthor.LastName
                 }).ToList();

        return View(products.ToList());



        // Original effort
        //var tblProduct = db.tblProducts.Include(t => t.tblAuthorProducts);
        //var products = (from prod in db.tblProducts
        //                join auProd in db.tblAuthorProducts on prod.Product_ID equals auProd.Product_ID
        //                join au in db.tblAuthors on auProd.Author_ID equals au.Author_ID

        //                orderby prod.Product_ID
        //                select new
        //                {
        //                    ProductID = prod.Product_ID,
        //                    Title = prod.Title,
        //                    Author = au.LastName,

        //                }).ToList();
        //return View(products.ToList());
        //var tblTitles = db.tblTitles.Include(t => t.tblAuthor).Include(t => t.tblRegion);
    }

//Desired render

<table class="table">
<tr>
    <th>Product ID</th>
    <th>Title</th>
    <th>Author</th>
</tr>
@foreach (var item in Model)

{

    <tr>
        <td>

            @Html.DisplayFor(modelItem => item.Product_ID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            // LastName
        </td>
        </tr>
}
</table>

所以我在Console应用程序中测试了我的LINQ查询,我想要加入的所有信息都运行良好。

// LINQ
var products = (from pd in db.tblProducts
join aupd in db.tblAuthorProducts on pd.Product_ID equals aupd.Product_ID
join au in db.tblAuthors on aupd.Author_ID equals au.Author_ID
orderby pd.Product_ID
select new
{
pd.Title,
pd.Description,
pd.Start_FY,
pd.ProductType,
au.FirstName,
au.LastName
}).ToList();

foreach (var item in products)
{
Console.WriteLine("{0}", item);
Console.ReadKey();
}

所以我仍然使用相同的模型。 一旦我做了上述并设置了我的返回View(产品);我能够访问tblAuthor字段。

2 个答案:

答案 0 :(得分:1)

如果您有一个联结表,这意味着一个产品可以有多个作者,但您选择使用的选项意味着产品背后只有一个作者。如果确实如此,则不需要联结表。您只需在产品表中设置authorId字段即可。

产品需要一份作者列表,而不仅仅是一份。

旁注:理想情况下,您可能希望分开关注点。

  • 创建一个映射到数据库中每个表的模型。
  • 创建存储库以获取数据(使用linq)
  • 为所有可能的视图创建一个ViewModel。
  • 在Controller中填充ViewModel
  • 将ViewModel返回到视图。

答案 1 :(得分:0)

您不能以这种方式传递anonymous对象。首先,如果您需要创建ViewModel

实施例: 的视图模型:

public class ProductViewModel{
     public string Title { get; set; }
     public string Description { get; set; }
     public string Start_FY { get; set; }
     public string ProductType { get; set; }
     public string FirstName { get; set; }
     public string LastName { get; set; }
}

<强>动作:

public ActionResult Index()
{
var products = (from pd in db.tblProducts
join aupd in db.tblAuthorProducts on pd.Product_ID equals aupd.Product_ID
join au in db.tblAuthors on aupd.Author_ID equals au.Author_ID
orderby pd.Product_ID
select new ProductViewModel
{
pd.Title,
pd.Description,
pd.Start_FY,
pd.ProductType,
au.FirstName,
au.LastName
}).ToList();

 return View(products);
}

查看:

@model IEnumerable<ProductViewModel>
<table class="table">
<tr>
    <th>Product ID</th>
    <th>Title</th>
    <th>Author</th>
</tr>
@foreach (var item in Model)

{

    <tr>
        <td>

            @Html.DisplayFor(modelItem => item.Product_ID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
             @Html.DisplayFor(modelItem => item.FirstName)
        </td>
        </tr>
}
</table>

虽然如果你需要传递anonimus对象来查看,你可以关注this链接。