C#泛型问题

标签 c# .net linq-to-sql generics reflection

我正在构建的应用程序中有几个区域看起来我可能不得不违反 DRY(不要重复自己)原则。我真的很想保持干爽而不是被冲洗干净,想知道是否有人可以给我一件雨披。对于背景,我使用的是 C#/.NET 3.51 SP1、Sql Server 2008 和 Linq-to-Sql。

基本上,我的情况围绕以下场景展开。我需要能够从数据库中的几乎任何表中检索经过筛选的项目列表,或者我需要能够在给定主键 ID 的情况下从数据库中的任何表中检索单个项目。我很确定这些问题的最佳解决方案将涉及大量的泛型和/或反射。

以下是更深入的两个挑战。 (请原谅冗长。)

  1. 给定一个表名(或者可能是复数形式的表名),我希望能够检索表中经过过滤的元素列表。具体来说,此功能将与查找表一起使用。 (该数据库中大约有 50 个查找表。其他表将经常添加和/或删除。)当前的查找表都实现了一个名为 IReferenceData 的接口(interface)(我的),并具有 ID(PK)、标题、描述和活跃。

对于这些查找表中的每一个,有时我需要返回所有记录的列表。其他时候我只需要返回事件记录。任何 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();
}

这不会非常困难,但它确实增加了维护负担。

注意:重要的是,当返回列表时,我维护基础数据类型。这些查找表中的记录可能会被修改,我必须适本地应用更新。

  1. 对于我的 150 个表中的每一个,我都需要能够通过其主键 ID 检索单个记录(FirstOrDefault 或 SingleOrDefault)。同样,我不想多次编写相同的代码。我更希望有一种方法可以用于我的所有表。

我不太确定最好的方法是什么。我想到的一些可能性包括以下内容。 (对于它们的实现我没有具体的想法。我只是将它们列为思考的食物。)

一个。在数据上下文中使用类似 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 );
}

保留数据的 IQueryable 字符将推迟查询的执行,直到您准备好实现它。请注意,您可能希望省略默认排序或使用单独的方法进行排序和不进行排序,以允许您根据需要应用不同的排序。如果您将其保留为 IQueryable,这可能更有值(value),因为您可以根据需要将其与分页一起使用以减少实际返回(每个查询)的数据量。

关于C#泛型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1414132/

相关文章:

c# - 为什么不调用种子方法?

.NET 数据 GridView : Remove "current row" black triangle

.net - 在 linq to sql 中删除记录的最简洁语法

c# - Linq to SQL,在 where 子句中包含重复值

c# - 使用 Func 委托(delegate)返回值

c# - block 注释被字符串中的 "*/"关闭

c# - 如何在wpf中隐藏面板后面的项目

mysql - 在 visual studio 中使用 MySQL 并在运行时更改连接

c# - LINQ to SQL Math.Round 问题

c# - 将对象中的 Null 值转换为空字符串