我在DB中有2个表,这些表具有非常相似的模式,需要以类似的方式查询。我为linq实体创建了一个部分类,然后使类实现了一个接口,IEvent定义了我需要的具有匹配签名的所有属性。一切都很好,我可以将我的结果转换为IQueryable并使用相同的代码处理来自多个源的数据。我无法弄清楚的是基于任何“DataSource”(即事件表)当前处于活动状态来获取表的好方法,所以目前我有这个讨厌的switch语句,如果添加了另一个数据源,我将需要更新喜欢它一点。任何人都有任何聪明的想法,现在已经很晚了,我的大脑也失败了......:-S
代码如下:
private IQueryable<IEvent> getEvents(IEnumerable<int> IDs)
{
var db = new EventDataContext();
// activeDataSource is an enum defined elsewhere
switch (activeDataSource)
{
case DataSource.Source1:
return db.Events1.Where(e => IDs.Contains(e.ID)).Cast<IEvent>();
break;
case DataSource.Source2:
return db.Events2.Where(e => IDs.Contains(e.ID)).Cast<IEvent>();
break;
}
}
答案 0 :(得分:4)
我建议将该方法设为通用并使用DataContext.GetTable():
private IQueryable<IEvent> getEvents<T>(IEnumerable<int> IDs)
where T : class, IEvent
{
var db = new EventDataContext();
return db.GetTable<T>.Where(e => IDs.Contains(e.ID)).Cast<IEvent>();
}