【问题标题】:Linq to SQL inheritance patternsLinq to SQL 继承模式
【发布时间】:2010-03-04 01:38:35
【问题描述】:

请注意,我是 Linq To SQL 的新手。

我正在构建一个原型以将现有应用程序转换为使用 Linq To SQL 作为其模型(它是一个 MVVM 应用程序)。由于应用程序存在,我无法更改其数据模型。

该数据库包含有关事件的信息;这些是广告活动或奖品活动。因此,数据模型包括一个表(事件)和两个关联表(AdvertisingEvent 和 PrizeEvent)。在我的旧 C# 代码中,我有一个基类(Event)和两个子类(AdvertisingEvent 和 PrizeEvent),并使用工厂方法来创建适当的风格。

在Linq to SQL下无法做到,不支持这种继承策略。

我想做的是创建一个接口 (IEvent) 以包含基本的共享功能(例如,在每个子类中实现的属性“描述”)。我想我会添加一个属性到超类,例如 SharedStuff,将返回 AdvertisingEvent 或 PrizeEvent作为 IEvent。然后我可以从 WPF 绑定到 MyEvent.SharedStuff.Description。

这有意义吗?有一个更好的方法吗?

顺便说一句:我宁愿不必迁移到 Linq to Entities。

【问题讨论】:

    标签: linq linq-to-sql


    【解决方案1】:

    您始终可以使用接口继承来完成此操作。与其使用子类,不如让您的 IEvent 接口使用 IPrizeEvent 和 IAdvertisingEvent 接口派生自该接口。

    然后,根据接口工作。

    然后,您可以拥有不相互派生但实现适当接口的单独实现。

    此外,在 LINQ-to-SQL 中使用接口继承的一个很好的副作用是,如果您有在 IQueryable<T> 上运行的方法,其中 T 上的约束是 IEvent,您可以执行以下操作:

    // Get an IQueryable<AdvertisingEvent>
    IQueryable<AdvertisingEvent> events = ...;
    
    // A function to work on anything of type IEvent.
    static IQueryable<T> FilteredEvents<T>(this IQueryable<T> query, 
        string description)
        where T : class, IEvent
    
    {
        // Return the filtered event.
        return query.Where(e => e.Description == description);
    }
    

    然后像这样拨打电话:

    events = events.FilteredEvents("my description");
    

    【讨论】:

    • 感谢您的想法,我会试一试,看看使用感觉如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2012-05-29
    • 2010-09-09
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多