Linq BoilerPlate:是否需要全部?

Bri*_*ian 0 c# linq asp.net dataview

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

var dataSource = (from p in dv.ToTable().AsEnumerable() where filter(p) select p).AsDataView();

filter是一个Func<DataRow, bool>
dv被一个DataView
dataSource被用作一个DataSource用于DataGrid.

总之,这令我有点难看,我打电话ToTable,AsEnumerableAsDataView,所以我想知道是否有降低呼叫的数量的方法.

这是我能做到的那么简单吗?

编辑: DataGrid有分页,我使用dataSource来确定条目总数.我并不特别担心这个问题的效率; dv只有几千个项目,表格在内存中维护.

Jon*_*eet 6

好吧,有一件事,我会说使用查询表达式在这里有些笨拙.您的代码相当于:

var dataSource = dv.ToTable()
                   .AsEnumerable()
                   .Where(filter)
                   .AsDataView();
Run Code Online (Sandbox Code Playgroud)

我想说的更清楚.

另一种选择是:

var dataSource = dv.Cast<DataRowView>()
                   .Select(rowView => rowView.Row)
                   .Where(filter)
                   .ToList();
Run Code Online (Sandbox Code Playgroud)

这样可以避免构建a DataTable,因此也可能更有效(它只是DataRowView从视图中流式传输并选择它们的底层DataRows)但最后构建了一个List<DataRow>.另一方面,它现在不是真的在视图本身上行动 - 因为它只是选择底层行.根据您的观点,您可能会或可能不会根据需要执行操作.