C# 如何对源代码为Linq to SQL查询的DataGridView进行最佳筛选和排序? 我正在重构一个使用数据集和数据表的WiFrm应用程序。我正在尝试将数据移动到ADO.NET实体

C# 如何对源代码为Linq to SQL查询的DataGridView进行最佳筛选和排序? 我正在重构一个使用数据集和数据表的WiFrm应用程序。我正在尝试将数据移动到ADO.NET实体,c#,vb.net,winforms,visual-studio-2010,C#,Vb.net,Winforms,Visual Studio 2010,我的数据源窗口中有实体,可以将它们拖到各种datagridview上。BindingSources将自动创建。然后,在代码隐藏中,我设置了数据源: Dim context = New Entities() CompanyBindingSource.DataSource = context.companies.toList() 问题是Linq到SQL查询结果不是可排序或可筛选的绑定源,因此DGV上的排序不起作用;我也不能在BindingSources上设置过滤器 我遇到了许多其他的解决方案,这些

我的数据源窗口中有实体,可以将它们拖到各种
datagridview
上。
BindingSources
将自动创建。然后,在代码隐藏中,我设置了数据源:

Dim context = New Entities()
CompanyBindingSource.DataSource = context.companies.toList()
问题是Linq到SQL查询结果不是可排序或可筛选的绑定源,因此DGV上的排序不起作用;我也不能在
BindingSources
上设置过滤器

我遇到了许多其他的解决方案,这些解决方案对解决这些问题有所帮助。它们基本上将Linq查询包装在可排序列表中:

CompanyBindingSource.DataSource = BindingListView(Of company)(context.companies.toList())
公司的DGV也能工作。但问题是,相关实体(例如,在我的案例中,公司的合同列表)没有以这种方式包装,因此它们各自的DGV仍然不可排序或过滤

在检查并手动创建所有绑定源并设置其数据源属性之前,我希望确保没有遗漏任何内容。拖放绑定非常方便,在整个项目中广泛使用,因此这将节省大量时间


还有什么我遗漏的吗?

我提出的解决方案涉及部分类。假设我有一家
公司
,它有许多
合同
。如果我只是从“数据源”面板拖动关系,则在我的DGV中,
合同将不可排序。但我可以只为我的
公司使用分部类
,并添加我自己的集合:

Partial Public Class Company

    Public ReadOnly Property visibleContracts As SortableBindingList(Of contract)
        Get
            Dim list = New SortableBindingList(Of contract)

            For Each c As contract In contracts.ToList
                list.Add(c)
            Next

            Return list
        End Get
    End Property

End Class

现在我的DGV可以绑定到
visibleContracts
,设计师负责所有的同步-但是现在DGV可以排序了

您当然必须将查询结果包装成支持排序和筛选的内容,例如
BindingSource
。。。或者每次(使用modified OrderBy,Where)要排序时重新执行查询,过滤源,但假设我有5个相关的父子实体。目前,我可以拖放到DGV。但是没有办法给第三个孩子添加过滤或排序?为此,我必须自己实现所有的
BindingSources
和键关系,从而失去了设计器在定制DGV中的所有功能?因此,基本上,如果您想过滤子DGV,就不能使用设计器进行数据绑定。这是否准确?我不确定,事实上我很少使用designer,只是手动编写代码,我认为一定有一些解决方案,只需等待其他解决方案,有时问题发布后甚至可以在3天内添加答案。