Ant*_*lin 1 .net c# generics reflection linq-to-sql
我正在构建的应用程序中有几个区域,看起来我可能不得不违反DRY(不要重复自己)原则中的生活日光.我真的很想保持干爽而不会被人嘲笑,并且想知道是否有人可以给我一个雨披.对于后台,我使用的是C#/ .NET 3.51 SP1,Sql Server 2008和Linq-to-Sql.
基本上,我的情况围绕以下场景.我需要能够从我的数据库中的几乎任何表中检索过滤的项目列表,或者我需要能够从给定主键ID的数据库中的任何表中检索单个项目.我很确定这些问题的最佳解决方案将涉及大量的仿制药和/或反射.
以下是两个更深入的挑战.(请原谅详细程度.)
对于每个查找表,我有时需要返回所有记录的列表.其他时候我只需要返回活动记录.任何Linq-to-Sql数据上下文自动包含每个TableName的List属性.不幸的是,我不相信我可以使用它的原始形式,因为它是未过滤的,我需要在IsActive属性上应用过滤器.
一种选择是为所有50个表编写类似于以下的代码.育!
public List<AAA> GetListAAA(bool activeOnly)
{
return AAAs.Where(b => b.IsActive == true || b.IsActive == activeOnly).OrderBy(c => c.Title).ToList();
}
Run Code Online (Sandbox Code Playgroud)
这不会非常困难,但它确实增加了维护的负担.
注意:重要的是,当返回列表时,我维护基础数据类型.可以修改这些查找表中的记录,我必须适当地应用更新.
我不确定这里最好的方法是什么.我想到的一些可能性包括以下内容.(我对其实施没有具体的想法.我只是将它们列为思考的食物.)
A.在数据上下文中使用类似GetTableNameItemByID(Guid id)的方法.(好)B.在数据上下文中有一个像GetItem(this,string tableName,Guid id)这样的扩展方法.(更好)C.有一个像GetItem这样的通用方法或扩展方法(this,Table,Guid id).(我甚至不知道这是否可能,但它是最干净的.)(最佳)
补充说明
出于各种原因,我已经为我的数据上下文创建了一个部分类.如果方法作为普通方法包含在该部分类中,或者在扩展方法的单独静态类中,则肯定是可以接受的.
由于您已经部分实现了数据上下文,因此可以添加:
public IQueryable<T> GetList<T>( bool activeOnly ) where T : class, IReferenceData
{
return this.GetTable<T>()
.Where( b => !activeOnly || b.isActive )
.OrderBy( c => c.Title );
}
Run Code Online (Sandbox Code Playgroud)
保留数据的IQueryable字符将推迟查询的执行,直到您准备实现它为止.请注意,您可能希望省略默认顺序,或者使用单独的方法,无论是否订购,都可以根据需要应用不同的顺序.如果将其保留为IQueryable,这可能更有价值,因为如果您愿意,可以将其与分页一起使用以减少实际返回的数据量(每个查询).