Základní operace dotazů LINQ (C#)

Toto téma obsahuje stručný úvod do výrazů dotazů LINQ a některých typických druhů operací, které v dotazu provádíte. Podrobnější informace najdete v následujících tématech:

LINQ Query Expressions

Přehled standardních operátorů dotazů (C#)

Návod: Psaní dotazů v jazyce C #

Poznámka

Pokud už znáte dotazovací jazyk, jako je SQL nebo XQuery, můžete většinu tohoto tématu přeskočit. Přečtěte si o klauzuli " v další části, abyste se dozvěděli o pořadí klauzulí ve výrazech from dotazů LINQ.

Získání zdroje dat

V dotazu LINQ je prvním krokem určení zdroje dat. V jazyce C# jako ve většině programovacích jazyků musí být proměnná deklarována před použitím. V dotazu LINQ je klauzule na prvním místě, aby bylo možné zavést zdroj dat ( ) a from customers proměnnou rozsahu ( cust ).

//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
                        select cust;

Proměnná rozsahu je podobná iterační proměnné ve smyčce s tím rozdílem, že ve výrazu dotazu se foreach nevyskytne žádná skutečná iterace. Při spuštění dotazu bude proměnná rozsahu sloužit jako odkaz na každý po sobě jdoucí prvek v customers objektu . Vzhledem k tomu, že kompilátor může odvodit typ , není nutné jej cust explicitně určit. Další proměnné rozsahu lze zavést pomocí let klauzule . Další informace najdete v tématu let – klauzule.

Poznámka

Pro neobecná zdroje dat, jako je , musí být ArrayList proměnná rozsahu explicitně zadána. Další informace naleznete v části How to query an ArrayList with LINQ (C#) and from clause.

Filtrování

Pravděpodobně nejběžnější operací dotazu je použití filtru ve formě logického výrazu. Filtr způsobí, že dotaz vrátí pouze ty prvky, pro které má výraz hodnotu true. Výsledek se vyprodukuje pomocí where klauzule . Filtr, který se má použít, určuje, které prvky se mají vyloučit ze zdrojové sekvence. V následujícím příkladu se vrátí jenom ti, kteří mají adresu customers v Londýně.

var queryLondonCustomers = from cust in customers
                           where cust.City == "London"
                           select cust;

Pomocí známých logických operátorů a operátorů jazyka C# můžete použít tolik výrazů filtru, kolik je AND OR potřeba v where klauzuli . Pokud byste například chtěli vrátit jenom zákazníky z Londýna, jejichž název je AND "Čížka", napsali byste následující kód:

where cust.City == "London" && cust.Name == "Devon"

Pokud chcete vrátit zákazníky z Londýna nebo Paříže, napíšete následující kód:

where cust.City == "London" || cust.City == "Paris"

Další informace najdete v tématu where – klauzule.

Řazení

Často je vhodné seřadit vrácená data. Klauzule způsobí, že prvky ve vrácené sekvenci budou seřazeny podle výchozí porovnávače pro orderby seřazený typ. Například následující dotaz lze rozšířit tak, aby se výsledky seřadí podle Name vlastnosti . Vzhledem Name k tomu, že je řetězec, výchozí porovnávač provádí abecední řazení od A do Z.

var queryLondonCustomers3 =
    from cust in customers
    where cust.City == "London"
    orderby cust.Name ascending
    select cust;

Pokud chcete výsledky sesouvat v obráceném pořadí, od Z do A, použijte orderby…descending klauzuli .

Další informace najdete v tématu klauzule orderby.

Seskupování

Klauzule group umožňuje seskupit výsledky na základě klíče, který zadáte. Můžete například určit, že výsledky by měly být seskupeny podle tak, aby všichni zákazníci z Londýna nebo Paříže byly City v jednotlivých skupinách. V tomto případě cust.City je klíč .

// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>
  var queryCustomersByCity =
      from cust in customers
      group cust by cust.City;

  // customerGroup is an IGrouping<string, Customer>
  foreach (var customerGroup in queryCustomersByCity)
  {
      Console.WriteLine(customerGroup.Key);
      foreach (Customer customer in customerGroup)
      {
          Console.WriteLine("    {0}", customer.Name);
      }
  }

Když dotaz ukončíte s group klauzulí , budou mít výsledky podobu seznamu seznamů. Každý prvek v seznamu je objekt, který má člena, a seznam prvků, které jsou Key seskupeny v rámci tohoto klíče. Při iteraci dotazu, který vytvoří sekvenci skupin, musíte použít vnořenou foreach smyčku. Vnější smyčka iteruje přes každou skupinu a vnitřní smyčka iteruje přes členy každé skupiny.

Pokud musíte odkazovat na výsledky operace skupiny, můžete pomocí klíčového slova vytvořit identifikátor, na který into se můžete dále dotazovat. Následující dotaz vrátí pouze skupiny, které obsahují více než dva zákazníky:

// custQuery is an IEnumerable<IGrouping<string, Customer>>
var custQuery =
    from cust in customers
    group cust by cust.City into custGroup
    where custGroup.Count() > 2
    orderby custGroup.Key
    select custGroup;

Další informace najdete v tématu group – klauzule.

Připojení

Operace spojení vytvářejí přidružení mezi sekvencemi, které nejsou explicitně modelovány ve zdrojích dat. Můžete například provést spojení a vyhledat všechny zákazníky a distributory, kteří mají stejné umístění. V jazyce LINQ join klauzule vždy funguje proti kolekcím objektů místo databázových tabulek přímo.

var innerJoinQuery =
    from cust in customers
    join dist in distributors on cust.City equals dist.City
    select new { CustomerName = cust.Name, DistributorName = dist.Name };

V jazyce LINQ není použití tak často jako v jazyce SQL, protože cizí klíče v jazyce LINQ jsou v objektovém modelu reprezentovány jako vlastnosti, které udržují kolekci join položek. Objekt například Customer obsahuje kolekci Order objektů. Místo provedení spojení se k objednávkám přistupuje pomocí tečkového zápisu:

from order in Customer.Orders...  

Další informace najdete v tématu join – klauzule.

Výběr (projekce)

Klauzule select vytvoří výsledky dotazu a určuje "tvar" nebo typ každého vráceného prvku. Můžete například určit, zda se výsledky budou skládat z úplných objektů, pouze jednoho člena, podmnožiny členů nebo zcela odlišného typu výsledku na základě výpočtu nebo Customer vytvoření nového objektu. Pokud klauzule vytvoří něco jiného než kopii select zdrojového elementu, operace se nazývá projekce . Použití projekcí k transformaci dat je výkonnou funkcí výrazů dotazů LINQ. Další informace najdete v tématu Transformace dat pomocí LINQ (C#) a klauzule select.

Viz také