Description = "Milk cow's love", NumberInStock = 100},

  new ProductInfo{ Name = "Pure Silk Tofu",

    Description = "Bland as Possible", NumberInStock = 120},

  new ProductInfo{ Name = "Crunchy Pops",

    Description = "Cheezy, peppery goodness", NumberInStock = 2},

  new ProductInfo{ Name = "RipOff Water",

    Description = "From the tap to your wallet", NumberInStock = 100},

  new ProductInfo{ Name = "Classic Valpo Pizza",

    Description = "Everyone loves pizza!",  NumberInStock = 73}

};

// Здесь мы будем вызывать разнообразные методы!

Console.ReadLine();

<p id="AutBody_Root501">Базовый синтаксис выборки</p>

Поскольку синтаксическая корректность выражения запроса LINQ проверяется на этапе компиляции, вы должны помнить, что порядок следования операций критически важен. В простейшем виде каждый запрос LINQ строится с использованием операций from, in и select. Вот базовый шаблон, который нужно соблюдать:

var результат =

  from сопоставляемыйЭлемент in контейнер

  select сопоставляемыйЭлемент;

Элемент после операции from представляет элемент, соответствующий критерию запроса LINQ; именовать его можно по своему усмотрению. Элемент после операции in представляет контейнер данных, в котором производится поиск (массив, коллекция, документ XML и т.д.).

Рассмотрим простой запрос, не делающий ничего кроме извлечения каждого элемента контейнера (по поведению похожий на SQL-оператор SELECT * в базе данных):

static void SelectEverything(ProductInfo[] products)

{

  // Получить все!

  Console.WriteLine("All product details:");

  var allProducts = from p in products select p;

  foreach (var prod in allProducts)

  {

    Console.WriteLine(prod.ToString());

  }

}

По правде говоря, это выражение запроса не особенно полезно, т.к. оно выдает подмножество, идентичное содержимому входного параметра. При желании можно извлечь только значения Name каждого товара, применив следующий синтаксис выборки:

static void ListProductNames(ProductInfo[] products)

{

  // Теперь получить только наименования товаров.

  Console.WriteLine("Only product names:");

  var names = from p in products select p.Name;

  foreach (var n in names)

   {

    Console.WriteLine("Name: {0}", n);

  }

}

<p id="AutBody_Root502">Получение подмножества данных</p>

Чтобы получить определенное подмножество из контейнера, можно использовать операцию where. Общий шаблон запроса становится таким:

var результат =

  from элемент in контейнер

  where булевскоеВыражение

 select элемент;

Обратите внимание, что операция where ожидает выражение, результатом вычисления которого является булевское значение. Например, чтобы извлечь из аргумента ProductInfo[] только товарные позиции, складские запасы которых составляют более 25 единиц, можно написать следующий код:

static void GetOverstock(ProductInfo[] products)

{

  Console.WriteLine("The overstock items!");

  // Получить только товары со складским запасом более 25 единиц.

  var overstock =

    from p

    in products

    where p.NumberInStock > 25

    select p;

  foreach (ProductInfo c in overstock)

  {

    Console.WriteLine(c.ToString());

  }

}

Как демонстрировалось ранее в главе, при указании конструкции where разрешено применять любые операции C# для построения сложных выражений. Например, вспомните запрос, который извлекал только автомобили марки BMW, движущиеся со скоростью минимум 90 миль в час:

// Получить автомобили BMW, движущиеся со скоростью минимум 90 миль в час.

var onlyFastBMWs =

  from c

  in myCars

  where c.Make == "BMW" && c.Speed >= 100

  select c;

Перейти на страницу:

Похожие книги