Linq BoilerPlate: все это нужно? - PullRequest
0 голосов
/ 08 марта 2011

У меня есть следующий код, который работает:

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

filter это Func<DataRow, bool>
dv это DataView
dataSource используется как DataSource для DataGrid.

Во всяком случае, мне кажется немного уродливым, что я звоню ToTable, AsEnumerable и AsDataView, поэтому мне было интересно, есть ли способ уменьшить количество вызовов.

Это так просто, как я могу это сделать?

Редактировать: В DataGrid есть нумерация страниц, и я использую источник данных для определения общего количества записей.Я не особенно беспокоюсь об эффективности этого;dv имеет только несколько тысяч элементов, и таблица хранится в памяти.

Ответы [ 2 ]

6 голосов
/ 08 марта 2011

Ну, во-первых, я бы сказал, что использование выражения запроса здесь несколько неуклюже.Ваш код эквивалентен:

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

, который, я бы сказал, более понятен.

Другая альтернатива будет:

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

Это позволяет избежать построения DataTable,это также может быть более эффективным (он будет просто передавать DataRowView s из представления и выбирать их базовые DataRow s), но в конце создаст List<DataRow>.С другой стороны, теперь не действует на само представление, на самом деле - потому что он просто выбирает нижележащие строки.Это может или не может делать то, что вам нужно, в зависимости от того, что делает ваш взгляд.

3 голосов
/ 08 марта 2011

Похоже, что вы хотите:

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

AsEnumerable требуется для DataTable и возвращает IEnumerable<DataRow>, который DataTable не реализует.

...