Sdílet prostřednictvím


Úvod do LINQ dotazy (C#)

A dotaz je výraz, který načítá data ze zdroje dat.Dotazy jsou obvykle vyjádřeno ve specializovaných dotazovací jazyk.Různé jazyky byly vyvinuty v průběhu času pro různé typy zdrojů dat, například SQL pro relační databáze a XQuery pro XML.Proto vývojáři museli učit nový jazyk dotazu pro každý typ zdroje dat nebo formát dat, která musí podporovat.LINQtéto situaci zjednodušuje tím, že nabízí konzistentní model pro práci s daty přes různé druhy datových zdrojích a formátech.V LINQ dotazu, vždy práci s objekty.Použít stejné základní kódování vzory dotazu a transformace dat. v dokumentech XML, databáze SQL ADO.NET datasetu kolekcí rozhraní .NET a jiný formát, pro kterou LINQ poskytovatele je k dispozici.

Tři části operace dotazu

Všechny LINQ dotazu, operace se skládá ze tří různých akcí:

  1. Získáte zdroj dat.

  2. Vytvoření dotazu.

  3. Spuštění dotazu.

Následující příklad ukazuje, jak tyto tři části operace dotazu jsou vyjádřeny ve zdrojovém kódu.V příkladu je použita celočíselné pole jako zdroj dat pro pohodlí; však koncepty použít jiné zdroje dat také.V tomto příkladu se nazývá v celé zbývající části tohoto tématu.

class IntroToLINQ
{        
    static void Main()
    {
        // The Three Parts of a LINQ Query:
        //  1. Data source.
        int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

        // 2. Query creation.
        // numQuery is an IEnumerable<int>
        var numQuery =
            from num in numbers
            where (num % 2) == 0
            select num;

        // 3. Query execution.
        foreach (int num in numQuery)
        {
            Console.Write("{0,1} ", num);
        }
    }
}

Následující ilustrace znázorňuje operaci dokončení dotazu.V LINQ spuštění dotazu se liší od dotazu, sama o sobě; jinými slovy nebyly načíst všechna data, stejně tak, že vytvoříte proměnnou dotazovacího.

Dokončení operace dotazu LINQ

Zdroj dat

V předchozím příkladu, protože zdroj dat je matice, implicitně podporuje obecného IEnumerable<T> rozhraní.Tato skutečnost znamená, že může být dotázána s LINQ.Dotaz je proveden v foreach prohlášení, a foreach vyžaduje IEnumerable nebo IEnumerable<T>. Typy, které podporují IEnumerable<T> nebo odvozené rozhraní, jako je například obecného IQueryable<T> , se nazývají dotazovatelný typy.

Dotazovatelný typ vyžaduje žádné změny ani zvláštní zacházení, které budou sloužit jako LINQ zdroje dat.Je-li zdroj dat již není v paměti jako dotazovatelný typ, LINQ poskytovatel musí představovat ho jako takové.Například Technologie LINQ to XML načtení dokumentu XML do dotazovatelný XElement typ:

// Create a data source from an XML document.
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");

S Technologie LINQ to SQL, nejprve vytvořit objektově relační mapování v době návrhu ručně nebo pomocí Object Relational Designer (O/R Designer).Psát své dotazy, proti objekty a v době běhu Technologie LINQ to SQL zpracovává komunikaci s databází.V následujícím příkladu Customers představuje určité tabulky v databázi a typ výsledku dotazu IQueryable<T>, je odvozen z IEnumerable<T>.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

// Query for customers in London.
IQueryable<Customer> custQuery =
    from cust in db.Customers
    where cust.City == "London"
    select cust;

Další informace o vytváření určitých typů zdrojů dat naleznete v dokumentaci k různým LINQ poskytovatelů.Základním pravidlem je však velmi jednoduchý: LINQ zdroj dat je libovolný objekt, který podporuje obecného IEnumerable<T> rozhraní nebo rozhraní, které dědí z něj.

[!POZNÁMKA]

Typy, jako je například ArrayList podporující neobecnou IEnumerable rozhraní mohou také sloužit jako LINQ zdroje dat.Další informace naleznete v tématu Jak: dotaz ArrayList s LINQ.

Dotaz

Dotazu určuje, jaké informace načíst ze zdroje dat nebo zdroje.V případě potřeby dotaz také určuje, jak tyto informace by měly být řazeny seskupeny a ve tvaru dříve, než je vrácena.Dotaz je uložena v proměnné dotazu a inicializaci pomocí výrazu dotazu.Chcete-li usnadnit psát dotazy, C# zavedla novou syntaxi dotazu.

Dotaz v předchozím příkladu vrátí všechna sudá čísla z pole celých čísel.Výraz dotazu obsahuje tři klauzule: from, where a select.(Pokud jste obeznámeni s SQL, můžete bude jste si všimli, že řazení klauzule je stornována z objednávky na serveru SQL.) from Klauzule určuje zdroj dat where klauzule použije filtr a select klauzule určuje typ vrácené prvky.Tyto a jiné klauzule dotazu jsou detailně popsány v LINQ dotazu výrazy (Příručka programování C#) oddílu.Nyní, důležité je, že v LINQ, proměnné v dotazu samotném neprovede žádnou akci a vrátí žádná data.Ukládá pouze informace, které je požadováno, aby výsledky při spuštění dotazu v určitém okamžiku později.Další informace o jak jsou dotazy konstruovány na pozadí naleznete v tématu Přehled operátorů standardní dotaz.

[!POZNÁMKA]

Dotazy lze také vyjádřit pomocí metody syntaxe.Další informace naleznete v tématu Syntaxe využívající dotazy a syntaxe využívající metody v jazyce LINQ (C#).

Provádění dotazu

Bb397906.collapse_all(cs-cz,VS.110).gifOdložené provedení

Jak bylo uvedeno dříve, proměnné v dotazu samotném ukládá pouze příkazy dotazu.Skutečné provádění dotazu je odloženo, dokud iteraci proměnné dotazu v foreach prohlášení.Tento pojem je označována jako odložené provedení a je znázorněn v následujícím příkladu:

//  Query execution. 
foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}

foreach Prohlášení je také, kde jsou načteny ve výsledcích dotazu.Například v předchozím dotazu iterační proměnná num zastává každou hodnotu (postupně) ve vrácené sekvence.

Protože proměnná dotazu sám nikdy obsahuje výsledky dotazu, můžete ho provést tak často, můžete libovolně.Může mít například databázi, která je neustále aktualizován v samostatné aplikaci.V aplikaci můžete vytvořit jeden dotaz, který načítá aktuální data a můžete také spustit jej opakovaně v některých intervalech získat různé výsledky pokaždé, když.

Bb397906.collapse_all(cs-cz,VS.110).gifVynucení okamžitého spuštění

Dotazy, které provádějí funkce agregace přes oblast zdrojových prvků první iteraci těchto prvků.Examples of such queries are Count, Max, Average, and First.Tyto proveden bez explicitní foreach prohlášení protože samotný dotaz musíte použít foreach za účelem vrácení výsledku.Všimněte si také, že tyto typy dotazů vrací pouze jednu hodnotu, není IEnumerable kolekce.Následující dotaz vrátí počet sudá čísla zdrojového pole:

var evenNumQuery = 
    from num in numbers
    where (num % 2) == 0
    select num;

int evenNumCount = evenNumQuery.Count();

Chcete-li vynutit okamžité spuštění libovolný dotaz a jeho výsledků do mezipaměti, můžete volat ToList<TSource> nebo ToArray<TSource> metod.

List<int> numQuery2 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToList();

// or like this:
// numQuery3 is still an int[]

var numQuery3 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToArray();

Můžete vynutit spuštění vložením foreach smyčka ihned po výrazu dotazu.Avšak voláním ToList nebo ToArray také mezipaměti všechna data v jedné kolekci objektů.

Viz také

Úkoly

Názorný postup: Psaní dotazů v jazyce C# (LINQ)

Vzorky LINQ

Referenční dokumentace

foreach (C# odkazu)

Koncepty

O/R Designer Overview

LINQ dotazu výrazy (Příručka programování C#)

Další zdroje

Začínáme s LINQ v jazyce C#

Dotaz klíčová slova (C#-Reference)

LINQ a odložené provedení Video