2011-10-26 21 views
0

我的实体数据模型中有大约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我失去了对特定报表列早期绑定的所有优点。

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

回答

1

可以利用这一事实,所产生的实体部分类由具有任何优势(或全部,如果它们符合要求)执行暴露像start_dateend_date“常用”的属性的接口IFoo

然后,您可以编写一个通用的过滤方法(代码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); 
} 

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

相关问题