【问题标题】:How to only return a list of inherited instances if defined, otherwise return the base class如果已定义,如何仅返回继承实例的列表,否则返回基类
【发布时间】:2019-12-24 07:38:02
【问题描述】:

我正在尝试扩展现有应用程序。我需要实现定义产品的多个实例的能力,同时保持它与产品类的现有实现向后兼容。

当前产品类别:

public class Product {
    public int Id {get; set;}
    public string Name {get; set;}
    public decimal Price {get; set;}
}

通过简单的 EF 调用 context.Products.ToList() 来获取列表。

现在我想扩展现有的类以能够定义“子产品”。我的第一次尝试:

public class Product {
    public int Id {get; set;}
    public string Name {get; set;}
    public decimal Price {get; set;}
    public List<SubProduct> SubProducts {get; set;}
}

public class SubProduct : Product {
    public string Identifier {get; set;}
}

现在,如果我有 Product 实例 ProductA(5 欧元,没有 subproducts)和实例 ProductB(7 欧元)和 2 Subproducts“1”和“2”,我需要获取获取所有产品时的以下列表:

Name        Price
ProductA    €5
ProductB-1  €7
ProductB-2  €7

如何获取所有产品的列表,但返回子产品(不包括其祖先)和产品的组合?

这必须以该列表与应用程序中所有已经存在的调用兼容的方式返回(这样上面的简单 EF 调用就会得到这个列表)

【问题讨论】:

    标签: c# entity-framework linq oop


    【解决方案1】:

    看来你需要SelectMany:

    var resss = produc
     .SelectMany(p => p.SubProducts ?? new List<SubProduct>() { new SubProduct { Identifier = "" } },
      (parent, child) => new { Name = !string.IsNullOrWhiteSpace(child.Identifier) ? parent.Name + "-" + child.Identifier : parent.Name, parent.Price});
    

    结果是:

    【讨论】:

    • 那不会只给我一个子产品列表吗?而且我还需要更改现有应用程序中的所有调用。我希望调用 context.Products.Tolist() 会返回产品(那些没有子产品的产品)和子产品
    • @intrixius 不,这将返回ProductsSubProductsSelectMany 将返回列表列表的查询展平,因此最终您将拥有一个包含 ProductsSubProducts 的列表。
    • 好的,但这意味着我必须重写整个应用程序的所有调用。我是否还应该包含一个过滤器,以使列表中没有“基础”产品,例如 context.Products.SelectMany(p =&gt; p.SubProducts).Where(p =&gt; p.SubProducts.Count()=0).ToList()
    • 谢谢。你有没有机会告诉我你是如何这么快就得到一个有效的例子的?
    • 这绝对是一个不错的方法,但它并没有解决向后兼容的问题。这种方法意味着我必须将所有调用更改为context.Products.ToList()
    【解决方案2】:

    为了向后兼容,您需要HasDiscriminator 才能知道哪一行是什么实体

    【讨论】:

    • 我知道 EF 会创建一个 Discriminator 字段,但我不明白这将如何帮助我满足我的需要
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多