Nem é melhor: eles atendem a diferentes necessidades. A sintaxe da consulta é própria quando você deseja aproveitar várias variáveis de intervalo . Isso acontece em três situações:
- Ao usar a palavra-chave let
- Quando você possui vários geradores ( de cláusulas)
- Ao fazer junções
Aqui está um exemplo (dos exemplos do LINQPad):
string[] fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };
var query =
from fullName in fullNames
from name in fullName.Split()
orderby fullName, name
select name + " came from " + fullName;
Agora compare isso com a mesma coisa na sintaxe do método:
var query = fullNames
.SelectMany (fName => fName.Split().Select (name => new { name, fName } ))
.OrderBy (x => x.fName)
.ThenBy (x => x.name)
.Select (x => x.name + " came from " + x.fName);
A sintaxe do método, por outro lado, expõe toda a gama de operadores de consulta e é mais concisa com consultas simples. Você pode obter o melhor dos dois mundos misturando sintaxe de consulta e método. Isso geralmente é feito em consultas LINQ to SQL:
var query =
from c in db.Customers
let totalSpend = c.Purchases.Sum (p => p.Price) // Method syntax here
where totalSpend > 1000
from p in c.Purchases
select new { p.Description, totalSpend, c.Address.State };