Просто бомбовая новинка в 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 данными
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
Изящно и как-то непривычно :)
Очень интересно посмотреть на работу с xml
Отлично!!! 5 балов
Мне поооонравилось!
а мне интересно компилятор этот запрос тоже в цикл преобразовывает ?
А как же еще. Я думаю, что будет цикл, но компилятор это сделает хорошо. А для нас главное, что код выглядит красиво и с ним удобно работать.
Отличная штучка не знал такой вещи, интересно для XML Linq лучше чем XPath
Встроенный SQL - считается злом: смешение уровня базы данных и бизнес-логики - 10-20 лет назад от этого постарались избавиться все среды программирования. MS как всегда в ударе - глядишь лет через 5 "откроет" GOTO...
C++, насколько я понял тут не идет речь конкретно о БД. Linq - SQL-подобный язык для доступа к данным, т.ч. локальным и, видимо, с произвольной структурой. Как показывает практика, люди в MS достаточно адекватны и они не стали бы выдавать бесполезный продукт для астронавтов. Поэтому ждем статью про XML и радуемся жизни :)
Linq не является заменой SQL. Для доступа к данным в базах я все так же рекомендую SQL, ибо он универсален и эффективен. А глевное - выполняется на сервере.
Linq нужно использовать там, где нет возможности работать с SQL, как в приведенных здесь примерах и как в случае с XML. Linq можно использовать там, где данные все равно обрабатываются на клиенте.
>MS как всегда в ударе - глядишь лет через 5 "откроет" GOTO...
И кстати раз уж речь зашла о goto. Что за goto-фобия? Сколько раз я видел, как ревностные противники goto вставляют return в тело цикла, а всё почему?
Потому, что эти "дубы" не понимают почему не стоит употреблять goto, а тупо его избегают, видимо даже не осознавая, что return это то же самое, и если return записан не в последней строке функции, то это абсолютно эквивалентно использованию goto.
Даже если Linq будет лучше всех преобразовывать код в SQL и делать это прекрасно, использовать его, лично я не рекомендую. Я не рекомендую использовать и SQL запросы в коде. В этом случае, после каждого изменения данных придеться перекомпилировать программу. SQL запросы лучше хранить вне программы, чтобы их можно было легко изменять.
Именно поэтому многие противятся внедрению языка запросов в язык программирования. Я же считаю, что нужно находить везде золотую середину. Язык запросов можно внедрять в язык, но только там, где это нужно и эффективно. К базам данных я бы не стал так обращатся. По крайней мере пока такой яркой необходимости не встречал.
> большей гибкости, меньшей связности
А я наоборот считаю, что идет потеря гибкости. Для SQL запросов я предпочитаю максимально использовать возможности сервера, а это хранимые процедуры, функции, пакеты (в случае с Oracle). А DLL все равно нужно перекомпилировать. Если уж и нужно SQL запрос использовать в программе, то я предпочитаю его хранить в виде отдельного файла в директории с программой. Конечно, это не всегда, потому что иногда приходиться следовать правилам компании, в которой я работаю, но в собственных проектах, я не люблю интегрировать доступ к данным с исполняемым файлом. Я думаю, это наоборот слишком связывает меня и теряется гибкость.
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.