晚上好。
我在三个表之间创建了一个连接,其中一个是联结表。 我使用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字段。
答案 0 :(得分:1)
如果您有一个联结表,这意味着一个产品可以有多个作者,但您选择使用的选项意味着产品背后只有一个作者。如果确实如此,则不需要联结表。您只需在产品表中设置authorId字段即可。
产品需要一份作者列表,而不仅仅是一份。
旁注:理想情况下,您可能希望分开关注点。
答案 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链接。