Вы звоните Distinct()
на последовательности строк данных. Я не верю DataRow
переопределяет Equals
, так что любые два объекта DataRow
сравниваются как неравномерные.
Вам необходимо либо передать IEqualityComparer<DataRow>
, либо Distinct()
, либо сначала проецироваться в другой тип (например, анонимный тип, который уже реализует сравнение равенства), и вызывать Distinct()
в новой последовательности.
Если вы хотите продолжать работать с DataRow
, это, вероятно, проще всего реализовать сравнительный коэффициент равенства. Хотя DataRowComparer.Default
выглядит перспективным (об этом я раньше не знал) может не работает в вашем конкретном случае из-за поля byte[]
.
Лично мне нравится получать данные в более конкретные типы как можно быстрее, но YMMV. Обратите внимание, что если вы спроецировать весь DataTable
к более конкретному типу, вы могли бы написать Select
части как Where
пункта вместо:
var list = table.AsEnumerable()
.Select(row => new { Serial = row.Field<string>("serial"),
ContentBase64 = Convert.ToBase64String(row.Field<byte>("doc_content")),
Name = row.Field<string>("doc_name"),
Selected = row.Field<int>("selected") })
.Where(x => x.Selected == 1)
.Distinct()
.ToList();
Обратите внимание, что я преобразующее содержимое в строку base64, так что сравнение равенства будет работайте просто. Это не самый эффективный подход, но он is easy :) Если вам не нужен контент, вы можете избавиться от этого фрагмента проекции.
Что такое 'list'? Что находится внутри 'list'? Попробуйте использовать 'list.Distinct(). AsEnumerable(). CopyToDataTable(); ' – nemesv
' var list = dt_temp.Select ("selected = 1"); ' –
' int, byte [], string, int' –