Связывание запроса LINQ с DataGridView

Это очень запутанно, я использую AsDataView для привязки результата запроса к dgv, и он отлично работает со следующим:

var query = from c in myDatabaseDataSet.Diamond where c.p_Id == p_Id select c;
dataGridView1.DataSource = query.AsDataView();

Однако это приводит к ошибке:

var query = from item in myDatabaseDataSet.Items
    where item.p_Id == p_Id
    join diamond in myDatabaseDataSet.Diamond
        on item.p_Id equals diamond.p_Id
    join category in myDatabaseDataSet.DiamondCategory
        on diamond.dc_Id equals category.dc_Id
    select new
    {
        Product = item.p_Name,
        Weight = diamond.d_Weight,
        Category = category.dc_Name
    };

    dataGridView1.DataSource = query.AsDataView();

Ошибка:

Instance argument: cannot convert from
'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 
'System.Data.DataTable'

AsDataView не отображается в запросе. (Список). Почему это происходит? Как связать запрос выше с dgv, а затем?.

Ответ 1

Подпись AsDataView выглядит следующим образом:

public static DataView AsDataView(
    this DataTable table
)

Единственным параметром является DataTable.

Запрос, который у вас есть, возвращает IEnumerable анонимного типа, который не имеет неявного преобразования в DataTable (или последовательность из DataRow экземпляры, и в этом случае вы могли бы использовать это, чтобы помочь вам создать DataTable).

Вам нужно вернуть результаты в DataTable или что-то, что вы можете преобразовать в DataTable, а затем оно будет работать.

В вашем конкретном случае кажется, что вы (или используете) набрали DataSets. Если это так, то вы должны иметь возможность принимать значения, которые были выбраны, а затем создавать новые типизированные экземпляры DataRow (для вас должны быть методы factory), которые затем могут быть помещены в типизированный DataTable, который AsDataView может быть.

Ответ 2

просто преобразуйте результат в список и привяжите его к вашей сетке.

var query = from item in myDatabaseDataSet.Items
    where item.p_Id == p_Id
    join diamond in myDatabaseDataSet.Diamond
        on item.p_Id equals diamond.p_Id
    join category in myDatabaseDataSet.DiamondCategory
        on diamond.dc_Id equals category.dc_Id
    select new
    {
        Product = item.p_Name,
        Weight = diamond.d_Weight,
        Category = category.dc_Name
    }.ToList();
dataGridView1.DataSource = query;