C# 林克样板:所有这些都需要吗?

C# 林克样板:所有这些都需要吗?,c#,asp.net,linq,dataview,C#,Asp.net,Linq,Dataview,我有以下代码,它确实有效: var dataSource=来自dv.ToTable.AsEnumerable中的p,其中filterp选择p.AsDataView 过滤器是一个函数 dv是一个数据视图 数据源被用作DataGrid的数据源 无论如何,我觉得调用ToTable、AsEnumerable和AsDataView有点难看,所以我想知道是否有办法减少调用次数 这就这么简单吗 编辑:DataGrid有分页功能,我使用数据源来确定条目的总数。我并不特别担心这项工作的效率;dv只有几千个项目,表

我有以下代码,它确实有效:

var dataSource=来自dv.ToTable.AsEnumerable中的p,其中filterp选择p.AsDataView

过滤器是一个函数 dv是一个数据视图 数据源被用作DataGrid的数据源

无论如何,我觉得调用ToTable、AsEnumerable和AsDataView有点难看,所以我想知道是否有办法减少调用次数

这就这么简单吗


编辑:DataGrid有分页功能,我使用数据源来确定条目的总数。我并不特别担心这项工作的效率;dv只有几千个项目,表被保存在内存中。

看起来您需要:

var dataSource = dv.ToTable().AsEnumerable().Where(filter);

DataTable需要AsEnumerable,并返回DataTable未实现的IEnumerable。

首先,我要说的是,在这里使用查询表达式有点笨拙。您的代码相当于:

var dataSource = dv.ToTable()
                   .AsEnumerable()
                   .Where(filter)
                   .AsDataView();
我想说这更清楚

另一种选择是:

var dataSource = dv.Cast<DataRowView>()
                   .Select(rowView => rowView.Row)
                   .Where(filter)
                   .ToList();

这避免了构建DataTable,因此可能也更有效—它将从视图中流式传输DataRowView并选择其底层DataRows,但在最后构建一个列表。另一方面,它现在并没有作用于视图本身,因为它只是选择底层行。这可能会或可能不会满足您的需要,这取决于您的视图正在执行的操作。

您的第二个方法出现编译器错误,错误2“System.Collections.Generic.IEnumerable”不包含“AsDataView”的定义。我使用数据源来获得项目的总数,因此在效率方面,我需要通读所有数据。此外,我的DataGrid已分页,因此对任何不实现ICollection的内容都不满意。@Brian:如果第二种方法出现编译器错误,那么您的原始源代码也应该。。。不管怎样,您都需要通读所有数据,但不需要复制所有数据。直接调用ToList而不是AsDataView怎么样?@Brian:啊,我知道第一个代码是如何工作的了。我不知道EnumerablerRowCollection上有很多扩展方法。这太可怕了:我将第二个示例改为只调用ToList,因为我认为这就是您所需要的。好吧,现在您将其更改为ToList,编译器错误得以避免。尽管现在第二个备选方案出现运行时错误,但无法将“System.Data.DataRowView”类型的对象强制转换为“System.Data.DataRow”类型。第一个版本一直有效,这并不奇怪,因为正如您所指出的,它相当于我的原始代码。@Brian:对。将再次编辑。。。我希望DataView中的每一行都是DataRow,但事实并非如此。坚持