(referência de C#) da cláusula FROM
Uma expressão de consulta deve começar com um from cláusula.Além disso, uma expressão de consulta pode conter subconsultas, que também começam com um from cláusula.O from cláusula Especifica o seguinte:
A fonte de dados em que a consulta ou sub-consulta deverá ser executada.
Local a variável de intervalo que representa cada elemento da seqüência de origem.
Tanto a variável de intervalo e a fonte de dados são fortemente tipadas.A fonte de dados referenciada na from cláusula deve ter um tipo de IEnumerable, IEnumerable<T>, ou um tipo derivado, como IQueryable<T>.
No exemplo a seguir, numbers é a fonte de dados e num é a variável de intervalo.Observe que ambas as variáveis são fortemente tipadas até mesmo por meio de var palavra-chave é usada.
class LowNums
{
static void Main()
{
// A simple data source.
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
// Create the query.
// lowNums is an IEnumerable<int>
var lowNums = from num in numbers
where num < 5
select num;
// Execute the query.
foreach (int i in lowNums)
{
Console.Write(i + " ");
}
}
}
// Output: 4 1 3 2 0
A variável de intervalo
O compilador infere o tipo da variável de intervalo quando a fonte de dados implementa IEnumerable<T>.Por exemplo, se a fonte tem o tipo de IEnumerable<Customer>, e em seguida, a variável de intervalo é inferida para ser Customer.O único momento em que você deve especificar explicitamente o tipo é quando a fonte é não-genéricas IEnumerable digite como ArrayList.Para obter mais informações, consulte Como: consulta um ArrayList com LINQ.
No exemplo anterior num é inferido para ser do tipo int.Porque a variável de intervalo tem rigidez de tipos, você pode chamar métodos nele ou usá-lo em outras operações.Por exemplo, em vez de escrever select num, você poderia escrever select num.ToString() para fazer com que a expressão de consulta retornar uma seqüência de cadeias de caracteres em vez de números inteiros.Ou você poderia escrever select n + 10 para fazer com que a expressão retornar a seqüência 14, 11, 13, 12, 10.Para obter mais informações, consulte (referência de C#) da cláusula Select.
A variável de intervalo é como uma variável de iteração em uma foreach instrução, exceto para uma diferença muito importante: uma variável de intervalo, na verdade, nunca armazena os dados da fonte.Ele apenas uma conveniência sintática que permite a consulta descrever o que ocorrerá quando a consulta é executada.Para obter mais informações, consulte Introdução às consultas do LINQ (C#).
Compostos cláusulas from
Em alguns casos, cada elemento da seqüência de origem pode propriamente dito ser tanto uma seqüência ou conter uma seqüência.Por exemplo, sua fonte de dados pode ser um IEnumerable<Student> onde cada objeto do aluno na seqüência contém uma lista de resultados de teste.Para acessar a lista interna dentro de cada Student elemento, você pode usar compostos from cláusulas.A técnica é como usando aninhados foreach instruções.Você pode adicionar onde ou ClassificadoPor cláusulas para uma from cláusula para filtrar os resultados.O exemplo a seguir mostra uma seqüência de Student objetos, cada qual contendo um inner List de inteiros que representam de resultados de teste.Para acessar a lista interna, use um composto from cláusula.Você pode inserir cláusulas entre os dois from cláusulas, se necessário.
class CompoundFrom
{
// The element type of the data source.
public class Student
{
public string LastName { get; set; }
public List<int> Scores {get; set;}
}
static void Main()
{
// Use a collection initializer to create the data source. Note that
// each element in the list contains an inner sequence of scores.
List<Student> students = new List<Student>
{
new Student {LastName="Omelchenko", Scores= new List<int> {97, 72, 81, 60}},
new Student {LastName="O'Donnell", Scores= new List<int> {75, 84, 91, 39}},
new Student {LastName="Mortensen", Scores= new List<int> {88, 94, 65, 85}},
new Student {LastName="Garcia", Scores= new List<int> {97, 89, 85, 82}},
new Student {LastName="Beebe", Scores= new List<int> {35, 72, 91, 70}}
};
// Use a compound from to access the inner sequence within each element.
// Note the similarity to a nested foreach statement.
var scoreQuery = from student in students
from score in student.Scores
where score > 90
select new { Last = student.LastName, score };
// Execute the queries.
Console.WriteLine("scoreQuery:");
// Rest the mouse pointer on scoreQuery in the following line to
// see its type. The type is IEnumerable<'a>, where 'a is an
// anonymous type defined as new {string Last, int score}. That is,
// each instance of this anonymous type has two members, a string
// (Last) and an int (score).
foreach (var student in scoreQuery)
{
Console.WriteLine("{0} Score: {1}", student.Last, student.score);
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/*
scoreQuery:
Omelchenko Score: 97
O'Donnell Score: 91
Mortensen Score: 94
Garcia Score: 97
Beebe Score: 91
*/
Usando várias cláusulas from para realizar associações
Um composto from cláusula é usada para acessar as coleções internas em uma única fonte de dados.No entanto, uma consulta também pode conter vários from cláusulas que geram consultas complementares de fontes de dados independentes.Essa técnica permite que você execute a certos tipos de operações de associação que não serão possíveis utilizando o cláusula join.
A exemplo a seguir mostra como duas from cláusulas podem ser usadas para formar uma junção cruzada completa de fontes de dados de dois.
class CompoundFrom2
{
static void Main()
{
char[] upperCase = { 'A', 'B', 'C' };
char[] lowerCase = { 'x', 'y', 'z' };
// The type of joinQuery1 is IEnumerable<'a>, where 'a
// indicates an anonymous type. This anonymous type has two
// members, upper and lower, both of type char.
var joinQuery1 =
from upper in upperCase
from lower in lowerCase
select new { upper, lower };
// The type of joinQuery2 is IEnumerable<'a>, where 'a
// indicates an anonymous type. This anonymous type has two
// members, upper and lower, both of type char.
var joinQuery2 =
from lower in lowerCase
where lower != 'x'
from upper in upperCase
select new { lower, upper };
// Execute the queries.
Console.WriteLine("Cross join:");
// Rest the mouse pointer on joinQuery1 to verify its type.
foreach (var pair in joinQuery1)
{
Console.WriteLine("{0} is matched to {1}", pair.upper, pair.lower);
}
Console.WriteLine("Filtered non-equijoin:");
// Rest the mouse pointer over joinQuery2 to verify its type.
foreach (var pair in joinQuery2)
{
Console.WriteLine("{0} is matched to {1}", pair.lower, pair.upper);
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Cross join:
A is matched to x
A is matched to y
A is matched to z
B is matched to x
B is matched to y
B is matched to z
C is matched to x
C is matched to y
C is matched to z
Filtered non-equijoin:
y is matched to A
y is matched to B
y is matched to C
z is matched to A
z is matched to B
z is matched to C
*/
Para obter mais informações sobre as operações de associação usar várias from cláusulas, consulte Como: executar operações de associação personalizado (guia de programação do C#).
Consulte também
Conceitos
Expressões de consulta do LINQ (guia de programação do C#)