【发布时间】:2014-10-04 03:04:44
【问题描述】:
我有许多不同的表,每个表都有一些公共列和每个表独有的一些列。我正在使用实体框架对这些表进行操作,并使用 LINQ 查询进行过滤、排序等。下面的代码是我遇到的情况的高度简化示例。
var filter = "A";
using (var dc = new MyDataEntities())
{
var rpt1 = dc.Table1.Where(x => x.Name.StartsWith(filter));
var rpt2 = dc.Table2.Where(x => x.Name.StartsWith(filter));
var rpt3 = dc.Table3.Where(x => x.Name.StartsWith(filter));
}
如果我决定将过滤器从 StartsWith 更改为 Contains,例如,我必须在 3 个位置进行更改。如果我决定要添加排序,我必须在 3 个地方添加它,等等。(你可以猜到我的实际代码在多个类中发生了这种逻辑,而且不止 3 个实例。)
有没有什么方法可以编写一个函数来获取任何表并对该表中的公共列进行操作?所以我的最终结果是这样的:
using (var dc = new MyDataEntities())
{
var rpt1 = Filter(dc.Table1);
var rpt2 = Filter(dc.Table2);
var rpt3 = Filter(dc.Table3);
}
这样,我可以将过滤任何表的 Name 列的逻辑放入一个 Filter() 函数中。想法?
【问题讨论】:
-
您是否考虑过为您的实体添加接口,例如
INamedEntity { string Name {get;set; }?然后您可以编写一个包含您的查询并具有通用查询方法的类,例如List<TEntity> GetByName<TEntity>(string name) where TEntity : class, INamedEntity。或返回IQueryable进一步过滤。 -
rpt1, rpt2, rpt3都是同一个类型,和Table1, Table2, Table3一样吗?
-
@dbarnes 就目前而言,它们是不同的类型,即 rpt1 将是 IEnumerable
,rpt2 是 IEnumerable 等。如果将它们汇集到一个通用类型中可以实现解决方案,那么值得考虑. -
如果你把常用的列抽象出来就容易多了,我可以用抽象的和不抽象的都给出答案,你可以自己打电话。
标签: c# linq entity-framework