自动过滤DataTable

时间:2017-06-29 17:23:33

标签: c#

我有一个控制台应用程序连接到SQL Server数据库,其中包含多个表和视图。为了获得整个表格我就像这样:

myAppDataset dsTemp = new myAppDataset();
myAppDataset.AppLogDataTable dtLog = dsTemp.AppLog;
myAppDataset.AppUserDataTable dtUser = dsTemp.AppUser;

然后,当我需要过滤时,我创建一个DataView:

DataView dvLog = dtLog.DefaultView;
dvLog.RowFilter = "DeptID = 1";
DataView dvUser = dtUser.DefaultView;
dvUser.RowFilter = "DeptID = 1";

一切正常。

我想知道的是,是否有办法修改DataSet(或其他内容)以便我不需要创建DataViews?换句话说,我想要为DeptID = 1过滤所创建的每个AppLogDataTable,AppUserDataTable等。基本上我想要实现的是能够将参数传递给我的数据类构造函数,它将自动过滤所有数据表格,以便在使用它时,我不必担心每次都创建一个DataView并过滤表格(这也需要传递原始过滤参数)。

我尝试创建一个DataView并覆盖原始对象,但是出现了一个错误,即DataTable无法投放或出现这种情况:

myAppDataset dsTemp = new myAppDataset();
myAppDataset.AppLogDataTable dtLog = dsTemp.AppLog;
DataView dvLog = dtLog.DefaultView;
dvLog.RowFilter = "DeptID = 1";
dtLog = (myAppDataset.AppLogDataTable)dvLog.ToTable();

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

一些可能的建议:

使用Linq2Object,而不是使用DataView

var filterStep1 = dtUser.Where(x => x.DeptID == 1);
var filterStep2 = filterStep1.Where(x => x.XYZ < 40);
Console.WriteLine(filterStep2);

相当于:

var filter = dtUser.Where(x => x.DeptID == 1 && x => x.XYZ < 40);
Console.WriteLine(filter);

编辑sql查询

你可以在sql查询中过滤。

在TypedDataSet案例中,双击解决方案资源管理器中的myAppDataset,点击表格框下方的Fill, GetData()

在属性窗口(F4)中,单击双击Select Command属性。显示的查询设计器。添加过滤器进行查询(如果您不想编写1但是参数,请在条件中键入? - 它会自动创建命令参数。

使用列表作为标准

另一个解决方案是创建一个条件列表,并将它们连接到RowFilter:

var criteria = new List<string>();
criteria.Add("DeptID = 1");
criteria.Add("XYZ < 40");
dvUser.RowFilter = string.Join(" AND ", criteria);

答案 1 :(得分:0)

如果您不打算使用数据,那么您真的不应该从数据库中读取数据。过滤您的SQL查询。

select somecolumns from sometable where DeptID = 1

但是,让我们假装您正在将所有数据读入内存以用于缓存目的或类似的东西。不要将它放入DataSet,DataTable或DataView。那些是过时的结构。它们速度慢,效率低,并且没有任何绑定到强类型对象的好处。

而是创建一个表示数据的类型。由于你没有提供太多的背景,我将假装你正在与那些与部门有多对一关系的学生打交道。

public class Student
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int DepartmentId { get; set; }
}

现在你有了一些选择。您可以使用ADO.NET来获取数据。

public class StudentSqlServerRepository
{
    private readonly string _connectionString;

    public StudentSqlServerRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public List<Student> GetStudentsByDepartmentId(int departmentId)
    {
        var students = new List<Student>();

        using(var connection = new SqlConnection(_connectionString))
        using(var command = new SqlCommand("select Id, Name, DepartmentId from students where DepartmentId = @DepartmentId", connection))
        {
            command.Parameters.Add(new SqlParameter("DepartmentId", SqlDbType.Int).Value = departmentId);
            connection.Open();

            using(var reader = command.ExecuteReader())
            {
                while(reader.Read())
                {
                    var student = new Student();
                    student.Id = (int)reader["Id"];
                    student.Name = (string)reader["Name"];
                    student.DepartmentId = (int)reader["DepartmentId"];
                    students.Add(student);
                }                
            }
        }

        return students;
    }        
}

但那是很多令人讨厌的代码。幸运的是,Dapper,一个微型ORM,可以使它更清洁。

public class StudentSqlServerRepository
{
    private readonly string _connectionString;

    public StudentSqlServerRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public List<Student> GetStudentsByDepartmentId(int departmentId)
    {    
        using(var connection = new SqlConnection(_connectionString))
        {
            var students = connection.Query<Student>("select Id, Name, DepartmentId from students where DepartmentId = @DepartmentId", new { DepartmentId = departmentId}).AsList();
            return students;
        }           
    }        
}

现在让你的学生就像

一样简单
var studentRepository = new StudentSqlServerRepository(ConfigurationManager.ConnectionStrings["StudentDatabase"].ConnectionString);
var students = studentRepository.GetStudentsByDepartmentId(1);

//let's pretend this is Web Forms and we want to bind to a control
StudentsGridView.DataSource = students;
StudentsGridView.DataBind();

//let's pretend it's MVC and we want to return a View
return View(students);

比较内存使用情况,网络流量,查询执行时间以及此方法的整体简易性,而不是使用DataTable并在内存中进行过滤。