Číst v angličtině

Sdílet prostřednictvím


Vytvoření datové tabulky z dotazu (LINQ to DataSet)

Datová vazba je běžným použitím objektu DataTable . Metoda CopyToDataTable vezme výsledky dotazu a zkopíruje data do , DataTablekteré lze použít pro datovou vazbu. Po provedení operací s daty se nový DataTable sloučí zpět do zdroje DataTable.

Metoda CopyToDataTable pomocí následujícího procesu vytvoří DataTable z dotazu:

  1. Metoda CopyToDataTable naklonuje DataTable ze zdrojové tabulky ( DataTable objekt, který implementuje IQueryable<T> rozhraní). Zdroj IEnumerable obecně pochází z linQ to DataSet výrazu nebo dotazu metody.

  2. Schéma klonované DataTable je sestaveno ze sloupců prvního výčtu DataRow objektu ve zdrojové tabulce a název naklonované tabulky je název zdrojové tabulky se slovem "query" připojeným k ní.

  3. Pro každý řádek ve zdrojové tabulce se obsah řádku zkopíruje do nového DataRow objektu, který se pak vloží do naklonované tabulky. Vlastnosti RowState a RowError vlastnosti se zachovají v rámci operace kopírování. Vyvolá ArgumentException se, pokud DataRow objekty ve zdroji pocházejí z různých tabulek.

  4. Klonovaný DataTable objekt se vrátí po zkopírování všech DataRow objektů ve vstupní tabulce s možností dotazu. Pokud zdrojová sekvence neobsahuje žádné DataRow objekty, vrátí metoda prázdnou DataTable.

CopyToDataTable Volání metody způsobí spuštění dotazu vázaného na zdrojová tabulka.

Když metoda CopyToDataTable narazí buď na hodnotu null odkaz nebo nullable typ hodnoty v řádku ve zdrojové tabulce, nahradí hodnotu hodnotou Value. Tímto způsobem se hodnoty null zpracovávají správně ve vrácené DataTablehodnotě .

Poznámka: Metoda CopyToDataTable přijímá jako vstup dotaz, který může vracet řádky z více DataTable objektů nebo DataSet objektů. Metoda CopyToDataTable zkopíruje data, ale ne vlastnosti ze zdroje DataTable nebo DataSet objektů do vrácené DataTable. Budete muset explicitně nastavit vlastnosti na vráceném DataTableobjektu , například Locale a TableName.

Následující příklad dotazuje tabulku SalesOrderHeader pro objednávky po 8. srpnu 2001 a používá metodu CopyToDataTable DataTable k vytvoření z tohoto dotazu. Pak DataTable je vázán na BindingSource, který funguje jako proxy pro .DataGridView

// Bind the System.Windows.Forms.DataGridView object
// to the System.Windows.Forms.BindingSource object.
dataGridView.DataSource = bindingSource;

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable orders = ds.Tables["SalesOrderHeader"];

// Query the SalesOrderHeader table for orders placed
// after August 8, 2001.
IEnumerable<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
    select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable<DataRow>();

// Bind the table to a System.Windows.Forms.BindingSource object,
// which acts as a proxy for a System.Windows.Forms.DataGridView object.
bindingSource.DataSource = boundTable;

Vytvoření vlastní metody CopyToDataTable<T>

Existující CopyToDataTable metody pracují pouze se IEnumerable<T> zdrojem, kde obecný parametr T je typu DataRow. I když je to užitečné, neumožňuje vytváření tabulek ze posloupnosti skalárních typů, z dotazů, které vracejí anonymní typy, nebo z dotazů, které provádějí spojení tabulek. Příklad implementace dvou vlastních CopyToDataTable metod, které načítají tabulku ze posloupnosti skalárních nebo anonymních typů, naleznete v tématu Postupy: Implementace CopyToDataTable<T> Kde obecný typ T není DataRows.

Příklady v této části používají následující vlastní typy:

public class Item
{
    public int Id { get; set; }
    public double Price { get; set; }
    public string Genre { get; set; }
}

public class Book : Item
{
    public string Author { get; set; }
}

public class Movie : Item
{
    public string Director { get; set; }
}

Příklad

Tento příklad provede spojení přes SalesOrderHeader tabulky a SalesOrderDetail získá online objednávky z měsíce srpna a vytvoří tabulku z dotazu.

// Fill the DataSet.
var ds = new DataSet
{
    Locale = CultureInfo.InvariantCulture
};
FillDataSet(ds);

DataTable orders = ds.Tables["SalesOrderHeader"];
DataTable details = ds.Tables["SalesOrderDetail"];

var query =
    from order in orders.AsEnumerable()
    join detail in details.AsEnumerable()
    on order.Field<int>("SalesOrderID") equals
        detail.Field<int>("SalesOrderID")
    where order.Field<bool>("OnlineOrderFlag")
        && order.Field<DateTime>("OrderDate").Month == 8
    select new
    {
        SalesOrderID =
            order.Field<int>("SalesOrderID"),
        SalesOrderDetailID =
            detail.Field<int>("SalesOrderDetailID"),
        OrderDate =
            order.Field<DateTime>("OrderDate"),
        ProductID =
            detail.Field<int>("ProductID")
    };

DataTable orderTable = query.CopyToDataTable();

Příklad

Následující příklad dotazuje kolekci pro položky s cenou vyšší než 9,99 USD a vytvoří tabulku z výsledků dotazu.

// Create a sequence.
var items = new Item[]
{ new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"},
  new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"},
  new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Marissa Barnes"},
  new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Fernandez"}};

// Query for items with price greater than 9.99.
IOrderedEnumerable<Item> query = from i in items
                                 where i.Price > 9.99
                                 orderby i.Price
                                 select i;

// Load the query results into new DataTable.
DataTable table = query.CopyToDataTable();

Příklad

Následující příklad dotazuje kolekci pro položky s cenou vyšší než 9,99 a výsledky projektuje. Vrácená posloupnost anonymních typů se načte do existující tabulky.

// Create a sequence.
var items = new Item[]
{ new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"},
  new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"},
  new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Marissa Barnes"},
  new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Fernandez"}};

// Create a table with a schema that matches that of the query results.
var table = new DataTable();
table.Columns.Add("Price", typeof(int));
table.Columns.Add("Genre", typeof(string));

var query = from i in items
            where i.Price > 9.99
            orderby i.Price
            select new { i.Price, i.Genre };

query.CopyToDataTable(table, LoadOption.PreserveChanges);

Příklad

Následující příklad dotazuje kolekci pro položky s cenou vyšší než 9,99 USD a výsledky projektuje. Vrácená posloupnost anonymních typů se načte do existující tabulky. Schéma tabulky se automaticky rozbalí, protože typy Book jsou Movies odvozeny od typu Item .

// Create a sequence.
var items = new Item[]
{ new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"},
  new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"},
  new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Marissa Barnes"},
  new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Fernandez"}};

// Load into an existing DataTable, expand the schema and
// autogenerate a new Id.
var table = new DataTable();
DataColumn dc = table.Columns.Add("NewId", typeof(int));
dc.AutoIncrement = true;
table.Columns.Add("ExtraColumn", typeof(string));

var query = from i in items
            where i.Price > 9.99
            orderby i.Price
            select new { i.Price, i.Genre };

query.CopyToDataTable(table, LoadOption.PreserveChanges);

Příklad

Následující příklad dotazuje kolekci pro položky ceny vyšší než 9,99 USD a vrátí posloupnost Double, která je načtena do nové tabulky.

// Create a sequence.
var items = new Item[]
{ new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"},
  new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"},
  new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Marissa Barnes"},
  new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Fernandez"}};

// load sequence of scalars.
IEnumerable<double> query = from i in items
                            where i.Price > 9.99
                            orderby i.Price
                            select i.Price;

DataTable table = query.CopyToDataTable();

Viz také


Další materiály