【问题标题】:How to apply the same logic to multiple entity objects如何将相同的逻辑应用于多个实体对象
【发布时间】:2011-10-26 14:47:18
【问题描述】:

我的实体数据模型中有大约 20 个不同的报告表,它们都有一些公共字段(如 start_date 和 end_date)。当我的报告应用程序为给定报告提取数据时,我要做的第一件事就是过滤表中的今天日期。这意味着我在整个代码 (VB) 中都有与此类似的代码块:

Dim data = 
    From r in _context.Rpt1 
    Where 
        r.start_date <= Now And 
        r.end_date >= Now

似乎应该有一种方法可以将此逻辑放入一个可以让我过滤任何表的函数中,但我不知道如何构造它。我可以这样做:

Public Function FilterByDate(data As IEnumerable) As IEnumerable
    Return From d In data Where d.start_date <= Now And d.end_date >= Now
End Function

但由于返回值是一个通用的 IEnumerable,我失去了在特定报告列上提前绑定的所有优势。

有没有一种方法可以创建一个通用函数,该函数可以将一些逻辑应用于不同的对象并返回该特定对象而不是通用对象?或者,有没有办法将返回值转换回特定的实体对象类型?有没有另一种方法来解决这类问题?只是寻找想法或看待问题的不同方式。

【问题讨论】:

    标签: .net vb.net entity-framework


    【解决方案1】:

    您可以利用生成的实体是部分类这一事实,方法是让任何(或所有,如果它们符合要求)实现一个接口IFoo,该接口公开“通用”属性,如start_date 和@987654323 @。

    然后您可以编写一个通用的过滤方法(C# 中的代码,抱歉):

    public IQueryable<T> Filter<T>(IQueryable<T> queryable) where T : IFoo
    {
        var now = DateTime.Now;
        return queryable.Where(q => q.start_date <= now && q.end_date >= now);
    }
    

    由于泛型参数类型约束,这将接受任何有意义的可查询类型,但由于泛型参数类型推导,仍然允许您返回与传入完全相同的类型。

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多