我有包含2个表的数据库
TABLE Categories (CategoriesId, Name, Description)
TABLE Products (ProductId, CategoriesId, Title, ProductImageUrl)
类别通过CategoriesId链接到Products。
我正在尝试使用LINQ获取所有特定标题。
public ActionResult Browse(string categories)
{
var spices = spiceDB.Products.Include("Products").Single(p => p.Title == categories);
return View(spices);
}
产品型号
namespace SpiceShop.Models
{
public class Product
{
[Key]
public int ProductId { get; set; }
public int CategoriesId { get; set; }
public string Title { get; set; }
public string ProductImageUrl { get; set; }
public List <Categorie> Name { get; set; }
}
}
分类模型
namespace SpiceShop.Models
{
public class Categorie
{
[Key]
public int CategoriesId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
//public List<Product> ProductId { get; set; }
public List<Product> Products { get; set; }
}
}
答案 0 :(得分:6)
只需删除.Include(“Products”),这不是它的使用方式。
错误很明显,“产品”型号没有“产品”属性。
答案 1 :(得分:4)
修改强>
看起来您的View需要一个Model为“Product”类型的单个对象。
另外,我试图给每个标识符/变量一个最能传达其含义和意图的名称。
编辑2:
请注意,更改方法上的任何输入参数名称都需要在调用该方法的View代码中进行相应的更改
在MVC中,Action-Method参数为automatically mapped
您的调试显示的网址为Browse?categories=Sauces
,该网址会自动映射到方法“浏览”,输入参数categories
设置为“Sauces”。但是(我的版本)Browse方法需要categoryName
参数,而不是categories
。因此,您需要确保URL属性和方法参数具有完全相同的名称。
因此,如果您确实需要将所选类别的名称作为输入参数传递:
public ActionResult Browse(string categoryName)
{
// Gets the CategoryId for the given categoryName, or zero if not found.
var categoryId = spiceDB.Categories
.Where(c => c.Name == categoryName)
.Select(c => c.CategoriesId)
.FirstOrDefault();
// Gets the first Product (only) for the specified categoryId.
var firstProduct = category.Products
.FirstOrDefault(p => p.CategoriesId == categoryId);
return View(firstProduct);
}
然而,支持这种“父子关系”的更常见的使用场景是:
List<Product>
类型的模型,而不仅仅是Product
)e.g。
public ActionResult Browse(int categoryId)
{
var products = spiceDB.Products
.Where(p => p.CategoriesId == categoryId)
.ToList();
return View(products);
}
即。使您的产品列表更加全面,您的数据访问代码更简单,更高效。