Linq


11 0

Просто бомбовая новинка в VS - Linq. Что это такое? Это доступ к данным из кода, т.е. это что-то типа встроенного в .NET языка запросов SQL. Если в твоей голове возник вопрос - а зачем это нужно, то это значит, что ты недавно еще программируешь. Дело в том, что Linq умеет делать запросы не только к базам данных, но и к xml данным и даже к простым массивам. Ну разве не чудо? Представляешь, у тебя есть коллекция данных и ты без проблем пишешь к ней запросы на выборку!

Да что там говорить, вот тебе примерчик:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LinqTestApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var numbers = new int[] { 1, 2, 4, 7, 9, 12 };

            var evenNumbers = from p in numbers
                             where (p % 2) == 0
                             select p;

            foreach (var val in evenNumbers)
                Console.WriteLine(val);

            Console.ReadLine();
        }
    }
}

Вот смотрю на этот код и наслаждаюсь. Мне ни разу не пришлось думать о типах данных, благодаря оператору var я просто объявляю переменные, а C# сам определяет, что я конкретно имел ввиду. Меньше головной боли, больше мыслей уходит на более важные части программы - логику.

Итак, смотрим пример. Здесь создается массив чисел numbers. После этого к эти данным пишеться запрос:

from p in numbers
where (p % 2) == 0
select p;

Чудо? Еще какое. А главное, что если ты знаком хоть немного с SQL, тебе не придеться учить синтаксис, все ясно, как ясный день. Запрос действительно похож на SQL, только операторы select, from и where идут немного в другом порядке. В данном случае я запрашиваю все данные из массива, где число делиться на без остатка (остаток равен нулю), т.е. четные числа.

Первая строка описывает, откуда мы должны взять данные или к чему идет запрос. В данном случае он идет к массиву numbers. Тут же мы говорим, что каждая запись массива будет видна запросу в виде переменной p (можно назвать и по другому). Эту переменную можно использовать дальше в запросе в секции where или select

Усложним пример, давайте обратимся не к простому массиву к списку пользовательских данных

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LinqToUserDataApplication
{
  public class User
  {
    public string UserName { get; set; }
    public string City { get; set; }
    public string Phone { get; set; }

    public override string ToString()
    {
      return UserName + "\t" + City + "\t" + Phone;
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
       var users = new List
       {
        new User { UserName = "Смирнов", City = "Москва", Phone = "0201513165" },
        new User { UserName = "Иванов", City = "Москва", Phone = "74854646" },
        new User { UserName = "Петров", City = "Питер", Phone = "6786876" },
        new User { UserName = "Сидоров", City = "Питер", Phone = "454849" },
        new User { UserName = "Фленов", City = "Питер", Phone = "489678" },
        new User { UserName = "Леонов", City = "Бабруйск", Phone = "7897964" }
       };

       var results = from c in users
             where c.City == "Москва"
             select c;

       foreach (var c in results)
         Console.WriteLine(c);

       Console.ReadLine();
    }
  }
}

В данном примере объявляется класс User, который хранит данные пользователя. В теле основной программы объявляется список List из таких пользователей и заполняется данными. Как теперь выбрать из этого списка всех пользователей, живущих в Москве? Раньше пришлось бы писать цикл, который бы перебирал все записи и сравнивал города. Если условие поиска будет более сложным, то код цикла становиться не красивым. Сейчас достаточно написать вот такой запрос:

var results = from c in users
    where c.City == "Москва"
    select c;

Ну разве не прелесть? В следующий раз я покажу, как можно с помощью Linq работать с XML данными


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

while9tue0

21 Aпреля 2008

Изящно и как-то непривычно :)
Очень интересно посмотреть на работу с xml


Pena

21 Aпреля 2008

Отлично!!! 5 балов


Rom@rio

21 Aпреля 2008

Мне поооонравилось!
а мне интересно компилятор этот запрос тоже в цикл преобразовывает ?


Михаил Фленов

21 Aпреля 2008

А как же еще. Я думаю, что будет цикл, но компилятор это сделает хорошо. А для нас главное, что код выглядит красиво и с ним удобно работать.


MasDen

21 Aпреля 2008

Отличная штучка не знал такой вещи, интересно для XML Linq лучше чем XPath


C++

22 Aпреля 2008

Встроенный SQL - считается злом: смешение уровня базы данных и бизнес-логики - 10-20 лет назад от этого постарались избавиться все среды программирования. MS как всегда в ударе - глядишь лет через 5 "откроет" GOTO...


while9tue0

23 Aпреля 2008

C++, насколько я понял тут не идет речь конкретно о БД. Linq - SQL-подобный язык для доступа к данным, т.ч. локальным и, видимо, с произвольной структурой. Как показывает практика, люди в MS достаточно адекватны и они не стали бы выдавать бесполезный продукт для астронавтов. Поэтому ждем статью про XML и радуемся жизни :)


Михаил Фленов

23 Aпреля 2008

Linq не является заменой SQL. Для доступа к данным в базах я все так же рекомендую SQL, ибо он универсален и эффективен. А глевное - выполняется на сервере.

Linq нужно использовать там, где нет возможности работать с SQL, как в приведенных здесь примерах и как в случае с XML. Linq можно использовать там, где данные все равно обрабатываются на клиенте.


Romul

23 Aпреля 2008

>MS как всегда в ударе - глядишь лет через 5 "откроет" GOTO...
И кстати раз уж речь зашла о goto. Что за goto-фобия? Сколько раз я видел, как ревностные противники goto вставляют return в тело цикла, а всё почему?
Потому, что эти "дубы" не понимают почему не стоит употреблять goto, а тупо его избегают, видимо даже не осознавая, что return это то же самое, и если return записан не в последней строке функции, то это абсолютно эквивалентно использованию goto.


Михаил Фленов

23 Aпреля 2008

Даже если Linq будет лучше всех преобразовывать код в SQL и делать это прекрасно, использовать его, лично я не рекомендую. Я не рекомендую использовать и SQL запросы в коде. В этом случае, после каждого изменения данных придеться перекомпилировать программу. SQL запросы лучше хранить вне программы, чтобы их можно было легко изменять.

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


Михаил Фленов

23 Aпреля 2008

> большей гибкости, меньшей связности

А я наоборот считаю, что идет потеря гибкости. Для SQL запросов я предпочитаю максимально использовать возможности сервера, а это хранимые процедуры, функции, пакеты (в случае с Oracle). А DLL все равно нужно перекомпилировать. Если уж и нужно SQL запрос использовать в программе, то я предпочитаю его хранить в виде отдельного файла в директории с программой. Конечно, это не всегда, потому что иногда приходиться следовать правилам компании, в которой я работаю, но в собственных проектах, я не люблю интегрировать доступ к данным с исполняемым файлом. Я думаю, это наоборот слишком связывает меня и теряется гибкость.


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне