我有一个MVC 5站点连接到mysql数据库并使用实体框架(db first)。
在我的Products表中,父项可以包含许多子项。我们在这种情况下使用父项作为概述或容器,也就是父项是PRODUCT-XYZ概述,而子项是它的变体(PRODUCT-XYZ-1-INCH,PRODUCT-XYZ-2-INCH ,. ..)。由于会计来源如何组织事物,结构必须保持这种方式。
使用linq,很容易列出某个类别中的产品,按指定的ID提取产品信息等。但我无法理解如何使用linq查询完成以下操作。
====================
给定child的ProductID,拉出所有子列,如果这些列为空,则用parent(从ParentID派生)覆盖几个指定的列。
例如,给定ID为2的子节点,Description和DetailedDescription为空,因此使用它的父节点(ID为1)。
====================
与场景#1相同,但在列表情况下。在列出CategoryID 1中的所有产品时,如果它是父项,只需使用父值,如果它是子项并且在Description,DetailedDescription列中具有空值,则使用这些值。如果它是一个拥有它自己价值的孩子,那就使用它们。
表:产品
------------------------------------------------------------------
| ID | ParentID | ExternalID | Description | DetailedDescription |
------------------------------------------------------------------
| 1 | NULL | 3829 | Content | Content |
------------------------------------------------------------------
| 2 | 1 | 4837 | NULL | NULL |
------------------------------------------------------------------
| 3 | 1 | 9283 | Content | Content |
------------------------------------------------------------------
| 4 | 1 | 6382 | NULL | NULL |
------------------------------------------------------------------
| 5 | NULL | 3234 | Content | Content |
------------------------------------------------------------------
| 6 | 5 | 9283 | NULL | NULL |
------------------------------------------------------------------
| 7 | 5 | 2983 | Content | Content |
------------------------------------------------------------------
表:类别
-------------------------------
| ID | ExternalID | Name |
-------------------------------
| 1 | 2546 | Tools |
-------------------------------
| 2 | 3545 | Widgets |
-------------------------------
表:Category_Product
--------------------------
| CategoryID | ProductID |
--------------------------
| 1 | 1 |
--------------------------
| 1 | 2 |
--------------------------
| 1 | 7 |
--------------------------
====================
我一直在拉这样的特定产品的细节:
Product product = (from p in db.Products.Include("Assets").Include("RelatedProducts")
where p.ID == id
select p).SingleOrDefault();
我使用它来提取其产品的类别:
Category category = (from cats in db.Categories.Include("SubCategories").Include("Products")
where cats.ID == id
select cats).SingleOrDefault();
如果我没有提供足够的信息,请告诉我,即使是通用指南也会有所帮助。
答案 0 :(得分:0)
public class ProductVM
{
public int Id { get; set; }
public string Desc { get; set; }
public string DetailDesc { get; set; }
public List<CategoryVM> cats { get; set; }
}
public class CategoryVM
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Desc { get; set; }
public string DetailDesc { get; set; }
}
ProductVM product = new ProductVM();
using (YourEntities context = new YourEntities ())
{
product = (from x in context.Parents
where x.Id == 1
select new ProductVM
{
Id = x.Id,
Desc = x.Descr,
DetailDesc = x.DetailDesc
}).FirstOrDefault();
product.Categegories = (from x in context.Children
where x.ParentId == product.Id
select new CategoryVM
{
Id = x.Id,
ParentId = (int)x.ParentId,
Desc = x.Descr == null ? product.Desc : x.Descr,
DetailDesc = x.DetailDesc == null ? product.DetailDesc : x.DetailDesc
}).ToList();
}
如果您不熟悉?
,则称为三元运算符。它基本上是if / else的简称。在英语中,代码行显示为......&#34;如果x.Descr
为null
,则Desc
的值等于product.Desc
其他Desc
等于x.Desc
&#34;
您的ProductVM
将包含产品的所有值并包含其类别列表,如果x字段为空,则该特定类别将从产品中获取值
编辑:看起来我向后收到了产品 - 类别关系,但是这给了你做什么的要点