【问题标题】:LINQ: Property/field should inherit data on certain conditionsLINQ:属性/字段应在某些条件下继承数据
【发布时间】:2012-12-08 05:17:49
【问题描述】:

所以我正在做一个简单的项目管理系统,但遇到了一个 LINQ 难题。这可能很常见。项目任务基于模板(与数据库中的任务共享一个表)。项目任务具有默认从任务模板继承的多个字段,除非它们具有值。例如,UnitPrice 为 0 的 ProjectTask 记录将查看 ProjectTask 模板记录以获取实际价格。

如何使用 LINQ 实现这一点?我想过做一个 ObjectDataSource,但这远离了我处理所有其他数据的方式(在 LINQ 中)。我尝试使用如下代码创建派生类,但它没有显示在 LinqDataSource 中,即使我在 ORM 设计器中设置了继承。

我进行了一些谷歌搜索,但似乎找不到一个好的模型。有什么想法吗?一如既往的感谢。

public class ProjectTaskWithInheritance : ProjectTask
{
    public new decimal UnitPrice
    {
        get
        {
            if (IsServiceOverride)
                if (base.UnitPrice != 0)
                    return base.UnitPrice;

            return base.TaskTemplateRecord.UnitPrice;
        }
        set { base.UnitPrice = value; }
    }
}

【问题讨论】:

    标签: .net linq-to-sql inheritance


    【解决方案1】:

    您正在混淆继承级别:您的系统对相互继承的事物进行建模(即项目任务从项目任务模板继承UnitPrice);同时,您正尝试在 .NET 程序中使用继承对其进行建模。这是两种不同的继承:一种在您的数据层中,而另一种在您的代码层中。

    我建议在代码层中使用 containment 对数据层中的继承进行建模,而不是使用继承。每个ProjectTask 可以有一个可选的ProjectTask 实例,用作任务模板;如果在任务本身中找不到某个属性,请尝试在模板 object 中查找它。使属性可以为空,以允许在对象或其模板中未设置属性的情况。

    class ProjectTask {
        private ProjectTask Template {get;set;}
        private decimal? unitPriceOverride;
        public decimal UnitPrice {
             get {
                 return unitPriceOverride ?? (Template != null ? Template.UnitPrice : null);
             }
             set {
                 unitPriceOverride = value;
             }
        }
    }
    

    【讨论】:

    • 这很好——但是它是如何工作的,因为 ProjectTask 是一个 LINQ 实体,而 UnitPrice 已经是一个属性?我无法更改设计器生成的属性的工作方式,可以吗?谢谢 - 这真的很有帮助。
    • @MarkWilliams 您可以在设计师生成的属性之上添加您自己的计算属性。将您的设计师生成的属性重命名为UnitPriceImpl,并将其设为私有;然后使用UnitPriceImpl 计算“实际”UnitPrice。使用partial 类功能将您的代码添加到设计器生成的代码中。
    • 谢谢 - 很明显它很棒。
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多