如果指定的子值为NULL,则显示父值

时间:2014-09-25 11:19:15

标签: c# mysql linq asp.net-mvc-5

我有一个MVC 5站点连接到mysql数据库并使用实体框架(db first)。

在我的Products表中,父项可以包含许多子项。我们在这种情况下使用父项作为概述或容器,也就是父项是PRODUCT-XYZ概述,而子项是它的变体(PRODUCT-XYZ-1-INCH,PRODUCT-XYZ-2-INCH ,. ..)。由于会计来源如何组织事物,结构必须保持这种方式。

使用linq,很容易列出某个类别中的产品,按指定的ID提取产品信息等。但我无法理解如何使用linq查询完成以下操作。

====================

SCENARIO#1

给定child的ProductID,拉出所有子列,如果这些列为空,则用parent(从ParentID派生)覆盖几个指定的列。

例如,给定ID为2的子节点,Description和DetailedDescription为空,因此使用它的父节点(ID为1)。

====================

SCENARIO#2

与场景#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();

如果我没有提供足够的信息,请告诉我,即使是通用指南也会有所帮助。

1 个答案:

答案 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.Descrnull,则Desc的值等于product.Desc其他Desc等于x.Desc&#34;

您的ProductVM将包含产品的所有值并包含其类别列表,如果x字段为空,则该特定类别将从产品中获取值

编辑:看起来我向后收到了产品 - 类别关系,但是这给了你做什么的要点