Este é um conteúdo traduzido por máquina.
Guia de Programação C#
Noções básicas de expressão de consulta (Guia de programação C#)

O que é uma consulta e o que É ele?

Uma query é um conjunto de instruções que descrevem qual dado receber de um data source(ou sources) e em qual formato e organização os dados deveriam ter. Uma query é diferenciada a partir dos resultados que ela produz.

Geralmente, os dados de origem são organizados logicamente como uma sequência de elementos do mesmo tipo. Uma tabela de um banco de dados SQL contém uma sequência de linhas. Similarly, an ADO.NET DataTable contains a sequence of DataRow objects. Em um arquivo XML, existe uma "sequência" de elementos XML (apesar destes serem organizados hierarquicamente em uma estrutura de árvore). Uma coleçao na mémoria contém uma sequência de objetos.

Do ponto de vista do aplicativo, o tipo específico e a estrutura dos dados de origem original não é importante. O aplicativo sempre vê os dados de origem como um IEnumerable<(Of <(T>)>) ou IQueryable<(Of <(T>)>) coleção. Em LINQ to XML, os dados de origem são tornados Visível como um IEnumerable<XElement >. Em LINQ to DataSet, é um IEnumerable<DataRow >. Em LINQ to SQL, é um IEnumerable ou IQueryable de qualquer Personalizar objetos que você definiu para representar os dados na tabela SQL.

Dada essa seqüência de origem, uma consulta pode siga um destes três coisas:

  • Recupere um subconjunto dos elementos para produzir uma Novo seqüência sem modificar os elementos individuais. A consulta pode em seguida, classificar ou agrupar a seqüência retornada em várias formas, conforme o exemplo seguinte (presuma scores é uma int[]):

    C#
    IEnumerable<int> highScoresQuery =
        from score in scores
        where score > 80
        orderby score descending
        select score;
    
  • Recuperar uma seqüência de elementos como no exemplo anterior, mas Transformará-los para um novo tipo de objeto. Por exemplo, uma consulta pode recuperar apenas os últimos nomes de determinados registros de cliente em uma Origem de dados. Ou ele pode recuperar o registro completo e usá-lo para criar outro tipo de objeto de memória ou até mesmo dados XML antes de gerar a seqüência do resultado final. O exemplo a seguir mostra uma Transformarar de um int para um string. Anotação o novo tipo de highScoresQuery.

    C#
    IEnumerable<string> highScoresQuery2 =
        from score in scores
        where score > 80
        orderby score descending
        select String.Format("The score is {0}", score);
    
  • Recuperar um valor singleton sobre os dados de origem, tais como:

    • O número de elementos que coincidam com uma determinada condição.

    • O elemento que possui o valor maior ou menor.

    • O primeiro elemento que corresponde a uma condição ou soma de valores específicos de um conjunto especificado de elementos. Por exemplo, a seguinte consulta retorna o número de pontuação maior do que 80 da matriz de inteiro scores:

    C#
    int highScoreCount =
        (from score in scores
         where score > 80
         select score)
         .Count();
    

    No exemplo anterior, Anotação o uso de parênteses em torno da expressão de consulta antes da chamada ao método Count. Você também pode expressar isso usando uma Novo variável para armazenar o resultado de concreto. Essa técnica é mais legível, pois ele mantém a variável que armazede a consulta separade da consulta que armazede um resultade.

    C#
    IEnumerable<int> highScoresQuery3 =
        from score in scores
        where score > 80
        select score;
    
    int scoreCount = highScoresQuery3.Count();
    

No exemplo anterior, a consulta é executada na chamada para Count, porque Count deve iterar sobre os resultados em Ordem para determinar o número de elementos retornados pela highScoresQuery.

O que é uma expressão de consulta?

Um de expressão de consulta é uma consulta expressa na sintaxe de consulta. Uma expressão de consulta é uma Primeiro classe Idioma construir. Ele é como qualquer outra expressão e pode ser usado em qualquer contexto em que uma expressão de C# é válida. Uma expressão de consulta consiste em um conjunto das cláusulas escrito em uma sintaxe declarativa semelhante a SQL ou XQuery. Cada cláusula por sua vez contém um ou mais expressões do C# e essas expressões podem se ser uma expressão de consulta ou conter uma expressão de consulta.

Uma expressão de consulta deve começar com um cláusula from e deve terminar com umSelecionar de ou AAgruparar cláusula. Entre a Primeiro cláusula from e o último select ou group cláusula, ele pode conter um ou mais dessas cláusulas opcionais: onde, orderby, Junção, permitem e até adicionais de cláusulas. Também pode usar o na palavra-chave para habilitar o resultado de um join ou group cláusula para servir como a Origem para as cláusulas de consulta adicional na mesma expressão de consulta.

A variável de consulta

Em LINQ, uma variável de consulta é qualquer variável que armazena um de consulta em vez do de uma consulta de resultados. Mais especificamente, uma variável de consulta sempre é um tipo enumeráveis que produzirá uma seqüência de elementos quando ele é iterado em uminstrução de foreach ou uma chamada direta para o método IEnumerator.MoveNext.

O exemplo de código a seguir mostra uma expressão de consulta simples com uma fonte de dados, uma cláusula de filtragem, uma cláusula de pedido e nenhuma transformação dos elementos de origem. A cláusula select termina a consulta.

C#
static void Main()
{
    // Data source.
    int[] scores = { 90, 71, 82, 93, 75, 82 };

    // Query Expression.
    IEnumerable<int> scoreQuery = //query variable
        from score in scores //required
        where score > 80 // optional
        orderby score descending // optional
        select score; //must end with select or group

    // Execute the query to produce the results
    foreach (int testScore in scoreQuery)
    {
        Console.WriteLine(testScore);
    }                  
}
// Outputs: 90 82 93 82      

No exemplo anterior, scoreQuery é uma variável de consulta de ,que às vezes é chamado de apenas umconsulta. A variável de consulta armazena não dados resultado real, que são produzidos no loop foreach. E quando executa a instrução de foreach , os resultados da consulta não são retornados Através a variável de consulta scoreQuery. Em vez disso, eles são retornados Através a variável de iteração testScore. A variável scoreQuery pode ser iterada em um segundo loop foreach. Ela produzirá os mesmos resultados, desde que ele nem a Origem de dados foi modificada.

Uma variável de consulta pode armazenar uma consulta que é expresso na sintaxe de consulta ou sintaxe do método ou uma combinação dos dois. Os exemplos a seguir, os queryMajorCities e o queryMajorCities2 são variáveis de consulta:

C#
//Query syntax
IEnumerable<City> queryMajorCities =
    from city in cities
    where city.Population > 100000
    select city;


// Method-based syntax
IEnumerable<City> queryMajorCities2 = cities.Where(c => c.Population > 100000);

Através outro lado, os exemplos de dois a seguir mostram variáveis que não são variáveis de consulta, mesmo em cada é iniciada com uma consulta. Eles não são variáveis de consulta porque armazenam os resultados:

C#
int highestScore =
    (from score in scores
     select score)
    .Max();

// or split the expression
IEnumerable<int> scoreQuery =
    from score in scores
    select score;

int highScore = scoreQuery.Max();

IEnumerable<City> largeCityList =
    (from country in countries
     from city in country.Cities
        where city.Population > 10000
        select city)
       .ToList();

// or split the expression
IEnumerable<City> largeCityList2 =
    from country in countries
     from city in country.Cities
     where city.Population > 10000
     select city;

List<City> largeCities = largeCityList2.ToList();
ObservaçãoObservação:

Na Documentação de LINQ, variáveis que armazenam uma consulta têm a palavra "consulta" como parte de seus nomes. Variáveis que armazenam um resultado real não é necessário "consulta" em seus nomes.

Para obter mais informações sobre as diferentes maneiras para expressar consultas, consulte Sintaxe de consulta versus sintaxe do método (LINQ).

Explícito e implícita de digitação de variáveis de consulta

Esta documentação geralmente fornece o tipo explícito da variável de consulta em Ordem para mostrar o tipo de relação entre a variável de consulta e o Selecionar cláusula. No entanto, também pode usar a palavra-chave var para instruir o compilador a inferir o tipo de uma variável de consulta (ou qualquer outra variável local) em tempo de compilação. Por exemplo, o exemplo de consulta que foi mostrado anteriormente neste tópico também pode ser expresso por meio de digitação implícita:

C#
// Use of var is optional here and in all queries.
// queryCities is an IEnumerable<City> just as 
// when it is explicitly typed.
var queryCities =
    from city in cities
    where city.Population > 100000
    select city;

Para obter mais informações, consulte Digitada implicitamente variáveis Local (C# Guia de programação) e Relações de tipo em operações de Consulta (LINQ).

Iniciar uma expressão de consulta

Uma expressão de consulta deve começar com uma cláusula from. Ele especifica uma Origem de dados juntamente com uma variável de intervalo. A variável de intervalo representa cada elemento sucessivo na seqüência de origem como a seqüência de origem está sendo envolvida. A variável de intervalo é digitada altamente com base no tipo de elementos na Origem de dados. No exemplo a seguir, como countries é uma matriz de objetos de Country , a variável de intervalo também é digitada como Country. Porque a variável de intervalo é digitada altamente, você pode usar o operador ponto para acessar os membros do tipo disponíveis.

C#
IEnumerable<Country> countryAreaQuery =
    from country in countries
    where country.Area > 500000 //sq km
    select country;

A variável de intervalo está no escopo até que a consulta é finalizada com um ponto-e-vírgula ou com uma cláusula de continuação.

Uma expressão de consulta pode conter Múltiplo cláusulas from. Use as cláusulas adicionais from quando cada elemento da seqüência de origem é uma coleção ou contém uma coleção. Por exemplo, suponha que você tiver um conjunto de objetos de Country , cada uma delas conterá uma coleção de objetos City chamado Cities. Para consultar objetos da cada City Country, use duas cláusulas from como mostrado aqui:

C#
IEnumerable<City> cityQuery =
    from country in countries
    from city in country.Cities
    where city.Population > 10000
    select city;

For more information, see de cláusula (Referência C#).

Encerrar uma expressão de consulta

Uma expressão de consulta deve terminar com uma cláusula select ou uma cláusula group.

Cláusula de AAgruparar

Use a cláusula group para produzir uma seqüência de grupos organizados por uma chave que você especificar. A chave pode ser qualquer tipo de dados. Por exemplo, a consulta a seguir cria uma Cadeia de Caracteres de grupos que contém um ou mais objetos Country e cuja chave é um valor de Cadeia de Caracteres.

C#
var queryCountryGroups =
    from country in countries
    group country by country.Name[0];

Para obter mais informações sobre agrupamento, consulte cláusula de AAgruparar (Referência C#).

Selecionar cláusula

Use a cláusula select para produzir a Tudo outros tipos de seqüências. Uma cláusula simples select apenas produz uma seqüência do mesmo tipo de objetos como os objetos contidos na Origem de dados. No exemplo, a Origem de dados contém objetos Country. A cláusula orderby apenas classifica os elementos em uma Novo ordem e a cláusula select produz uma seqüência de objetos reordenada Country.

C#
IEnumerable<Country> sortedQuery =
    from country in countries
    orderby country.Area
    select country;

A cláusula select pode ser usada para transformar dados de origem em seqüências de novos tipos. Essa transformação também é chamada de projeção um . No exemplo a seguir, o de cláusula de select projetos uma seqüência de tipos anônimos que contém apenas um subconjunto de campos o elemento original. Anotação que os novos objetos são inicializados, usando um inicializador de objeto.

C#
// Here var is required because the query
// produces an anonymous type.
var queryNameAndPop =
    from country in countries
    select new { Name = country.Name, Pop = country.Population };

Para obter mais informações sobre Tudo as formas que uma cláusula select pode ser usado para transformar dados de origem, consulte Selecionar cláusula (Referência C#).

Continuação com "em"

Você pode utilizar a palavra-chave into em uma cláusula de select ou group para criar um identificador temporário que armazena uma consulta. Faça isso quando você deve executar operações de consulta adicional em uma consulta após um agrupamento ou selecionar a operação. No seguinte exemplo countries são agrupados de acordo com população em intervalos de 10 milhões. Depois que esses grupos estiverem cláusulas criado, adicionais filtro-out de alguns grupos e, em seguida, classificar os grupos em crescente da ordem. Para executar essas operações adicionais, a continuação representada por countryGroup é necessária.

C#
// percentileQuery is an IEnumerable<IGrouping<int, Country>>
var percentileQuery =
    from country in countries
    let percentile = (int) country.Population / 10000000
    group country by percentile into countryGroup
    where countryGroup.Key >= 20
    orderby countryGroup.Key
    select countryGroup;

// grouping is an IGrouping<int, Country>
foreach (var grouping in percentileQuery)
{
    Console.WriteLine(grouping.Key);
    foreach (var country in grouping)
        Console.WriteLine(country.Name + ":" + country.Population);
}

For more information, see em (Referência C#).

Filtragem, classificação e ingressando em

Entre a cláusula from inicial e o final select ou group cláusula, Tudo as outras cláusulas (where, join, orderby, from, let) são opcionais. Qualquer um das cláusulas opcionais pode ser usada zero vezes ou Múltiplo horas em um Mensagem de consulta.

onde cláusula

Use a cláusula where para Filtro elementos dos dados de origem com base em um ou mais expressões predicados. A cláusula where no exemplo a seguir tem dois predicados.

C#
IEnumerable<City> queryCityPop =
    from city in cities
    where city.Population < 200000 && city.Population > 100000
    select city;

Para obter mais informações, consulte onde cláusula (Referência C#).

orderby cláusula

Use a cláusula orderby para classificar os resultados em ordem crescente ou decrescente. Você também pode especificar ordens de Classificar secundária. O exemplo a seguir executa uma Classificar primária nos objetos country , usando a propriedade Area. Ele, em seguida, executa uma Classificar secundária, usando a propriedade Population.

C#
IEnumerable<Country> querySortedCountries =
    from country in countries
    orderby country.Area > 500000, country.Population descending
    select country;

A palavra-chave ascending é opcional; ele é a ordem de Classificar padrão se nenhuma ordem é especificada. For more information, see cláusula orderby (Referência C#).

Cláusula de Junção

Use a cláusula de join para associar e / ou combinar elementos de uma Origem de dados com elementos de Origem de dados de outro com base em uma comparação de igualdade entre chaves especificadas em cada elemento. Em LINQ, Junção operações são executadas em seqüências de objetos cujos elementos são tipos diferentes. Após você ter ingressado duas seqüências, você deve usar uma instrução de select ou group para especificar qual elemento para armazenar na seqüência de saída. Você também pode usar um tipo anônimo para combinar propriedades de cada conjunto de elementos associados em um novo tipo para a seqüência de saída. O exemplo a seguir associa prod objetos cuja propriedade Category corresponde a uma das categorias a matriz de Cadeia de Caracteres categories. Produtos cujo Category não coincide com qualquer Cadeia de Caracteres em categories são filtrados. A instrução select projetos um novo tipo cujas propriedades são obtidas do cat e prod.

C#
var categoryQuery =
    from cat in categories
    join prod in products on cat equals prod.Category
    select new { Category = cat, Name = prod.Name };

Você também pode executar uma Junção de AAgruparar, armazenando os resultados da operação join em um Temporário variável usando o na palavra-chave. For more information, see (Referência C#) de cláusula de Junção.

permitir que a cláusula

Use a cláusula let para armazenar o resultado de uma expressão como uma chamada de método em uma Novo variável de intervalo. No exemplo a seguir, a variável de intervalo s armazena primeiro elemento da matriz de Cadeia de Caracteres retornada por Split.

C#
string[] names = { "Svetlana Omelchenko", "Claire O'Donnell", "Sven Mortensen", "Cesar Garcia" };
IEnumerable<string> queryFirstNames =
    from name in names
    let firstName = name.Split(new char[] { ' ' })[0]
    select firstName;

foreach (string s in queryFirstNames)
    Console.Write(s + " ");
//Output: Svetlana Claire Sven Cesar

For more information, see permitir que a cláusula (Referência C#).

Subconsultas em uma expressão de consulta

Uma cláusula de consulta propriamente dito pode conter uma expressão de consulta, que às vezes é chamada como uma de subconsulta . Cada subconsulta começa com sua própria cláusula from que necessariamente não aponta para a mesma Origem de dados na Primeiro cláusula from. Por exemplo, a consulta a seguir mostra uma expressão de consulta que é usada na instrução Selecionar para recuperar os resultados de uma operação de agrupamento.

C#
var queryGroupMax =
    from student in students
    group student by student.GradeLevel into studentGroup
    select new
    {
        Level = studentGroup.Key,
        HighestScore =
            (from student2 in studentGroup
             select student2.Scores.Average())
             .Max()
    };

For more information, see Como: Executar uma subconsulta em uma operação de agrupamento (Guia de programação C#).

Consulte também

Conceitos

Referência

Outros recursos

Marcas :


Page view tracker