31. C-sharp 27 25-03-2014

Created Tuesday 25 March 2014

Linq

//////////////////////////////
  1. Базовые операции Linq2SQL — продолжение
    1. Update
      1. var rec = from ppp in db.pos where ppp.id_p == 4 select ppp;
      2. foreach (var r in rec)
      3. {
        1. r.opis = "kuku";
      4. }
      5. db.SubmitChanges(); На уроке не работало Потом заработало (возможно, после добавления первичного ключа)
      6. http://www.codeproject.com/Articles/46422/A-LINQ-Tutorial-Adding-Updating-Deleting-Data
    2. Insert
      1. DAL_LTSQL.city c = new DAL_LTSQL.city();
      2. c.name = "Jerusalem";
      3. db.cities.InsertOnSubmit(c);
      4. db.SubmitChanges();
    3. При изменении дизайна таблицы (также называется словом "схема") — (например, добавление первичного ключа), следует открыть дизайнер и удалить из него таблицу и сохранить. Затем снова её добавить, убедиться, что изменения отображены, сохранить.
    4. Желательно создавать dbml файл отдельно для каждой задачи (соответственно, будет получен другой data context, напр. DAL_LTSQL.UserDataContext). При этом если в разных файлах будут совпадающие таблицы, то лучше разнести эти файлы по разным пространствам имён.
    5. Если по какой-то причине в таблице не должно быть первичного ключа, то для обновления/добавления строк в таблице нельзя пользоваться LINQ, следует "спуститься" к ADO.NET
    6. Если таблица существует исключительно для insert-ов (и будет большая), то имеет смысл не иметь первичных ключей и индексов, потому что каждая вставка будет обращаться к индексам и влиять на производительность.
    7. db.ExecuteCommand("update [pr].[dbo].[pos] set opis = 'kurkareku' where [opis] = 'kuku'"); — Если необходимо не выходя из LINQ произвести чистую команду SQL
    8. Квадратные скобки в SQL нужны, если имена таблиц (и т.д.) будут даваться с пробелами или не на английском
    9. В технологии LINQ2SQL база данных первична (должна быть создана заранее (если не пользоваться ExecuteCommand))
    10. Выборка из нескольких таблиц, варианты
      1. В SQL построить запрос. Используя его, создать view, дать имя и сохранить. Это view будет фигурировать, как таблица, и его можно будет добавить в дизайнер LINQ. Затем можно делать выборку из этой таблицы.
      2. Можно использовать JOIN (важно знать, кто главный и кто второстепенный)
        1. var v = from co in db.comps join po in db.pos on co.id equals po.id_c where co.name.StartsWith("int") select po;
      3. Если есть связь между таблицами (constraint/association), то класс главной таблицы содержит лист записей второстепенной, и делая выборку из главной, можно ссылаться на этот лист:
        1. var v1 = from co1 in db.comps select co1;
        2. foreach (var vv1 in v1)
        3. {
          1. foreach (var pp1 in vv1.pos)
          2. {
            1. if (vv1.name.StartsWith("int"))
            2. {
              1. foreach (var pp1 in vv1.pos)
              2. {
                1. ...
              3. }
            3. }
          3. }
        4. }
        5. Если на уровне базы таблицы не связаны ассоциацией, то её можно добавить в дизайнере LINQ — база не обновится, но можно будет использовать этот способ
      4. Entity Framework — следующая технология, с которой мы познакомимся в следующий раз
        1. Очень похоже на LINQ2SQL, но это гораздо более мощная технология с большей гибкостью и с большей сложностью + запросы выполняются где-то на 20% быстрее, чем в LINQ.
        2. Спроектирована не для построения ORM, а для более архитектурной работы, т.е. в Entity Framework классы предполагаются классами некоторой концептуальной модели, которая на самом деле не база данных, а объектная модель бизнес-логики.
        3. В первую очередь отличается тем, что объектная модель в дизайнере не обязательно один к одному таблицы и классы
        4. Можно сначала сделать классы, а из них — таблицу, т.е. классы первичны
        5. Не ограничена SQL сервером (можно работать с другими SQL СУБД)
        6. Работа ведётся средствами LINQ2SQL — различие не в диалекте, а в классах, которые можно использовать
      5. Entity Framework примеры
        1. Добавить ADO.NET Entity Data Model (.edmx)
        2. DAL_EF. prEntities dbef = new DAL_EF.prEntities(); — prEntities это контекст
        3. var efv = from company in dbef.comps select company;
        4. LINQ2SQL и Entity Framework могут конфликтовать на уровне таблиц, можно разнести по разным проектам
        5. Insert:
          1. DAL_EF.comp efcomp = new DAL_EF.comp();
          2. efcomp.name = "Specter";
          3. dbef.comps.Add(efcomp);
          4. dbef.SaveChanges();
      6. Extension methods — не LINQ, но введены для LINQ
Домашнее задание:
  1. Читать про Entity Framework в учебнике



Backlinks: