在实体框架中使用 bindingSource 的过滤器

Posted

技术标签:

【中文标题】在实体框架中使用 bindingSource 的过滤器【英文标题】:use filter of bindingSource with Entity Framework 【发布时间】:2012-08-20 22:34:57 【问题描述】:

我正在开发一个 C# win-form 应用程序。

在我的表单中,我有与 Binding-Source 绑定的 Data-Grid-View,而 Binding-Source Data-source 是一个实体框架表。

当我使用实体框架时,我不能使用绑定源的过滤器和按数据网格视图的列排序,但是当我不使用实体框架时,我可以使用它们。 我如何将它们与实体框架一起使用?

表单加载时我的代码是

contex = new myEntity();
myBindingSource.DataSource = contex.myTable;

【问题讨论】:

How to sort DataGridView when bound to a binding source that is linked to an EF4 Entity 的可能重复项 【参考方案1】:

您标记了实体框架,但没有显示您的模型。假设 MyEntity 是您的 ObjectContext 或 DBContext,您可以绑定到 DbSet 的 local property,这是一个支持排序的可观察集合。

myBindingSource.DataSource = contex.myTable.Local;

【讨论】:

【参考方案2】:

每个 BindingSource 都有一个属性 SupportsFiltering(和 SupportsSorting)。如果您将 entitySet 设置为 DataSource,这两个属性会自动设置为 false!所以有一些可能的解决方案。您可以为IEnumberable<T> 提供扩展方法,如here 所示,或者您选择使用Linq2Entities 进行过滤/排序。

Linq2Entities 的片段可以是:

myEntity context = new myEntity();
myBindingSource.DataSource = (from m in context.myTable
                              where m.PROPERTY MEETS CONDITION
                              select m).ToList<TYPE>();

扩展方法的片段:

// extension method
public static IEnumerable<T> Filter<T>(this IEnumerable<T> list, Func<T, bool> filterParam) 
        return list.Where(filterParam);


// filtering example
context.myTable.Filter(x => x.ItemName.StartsWith("Test"))

此外,这个主题之前已经讨论过很多次,甚至在SO 上也是如此。

【讨论】:

编辑和更新答案。 @calling saveChanges on bindingSourceChange - 对不起,我不明白这个评论。你到底是什么意思,也许你可以根据这个细节更新你的问题 - 提前谢谢

以上是关于在实体框架中使用 bindingSource 的过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Linq 表未出现在 BindingSources 的数据源列表中

什么时候值得使用 BindingSource?

BindingSource组件使用??

如何:用BindingSource将Windows Forms控件绑定到工厂对象

“BindingSource不能是它自己的数据源” - 尝试从另一个类中的方法重置绑定源时出错

BindingSource.Filter 排除值 - 如何?