Linq - как это работает? - PullRequest
5 голосов
/ 19 марта 2010

Я только что заглянул в Linq с ASP.Net. Это действительно опрятно. Мне было просто интересно - как все классы заполняются? Я имею в виду в ASP.Net, предположим, что у вас есть файл Linq с именем Catalog, а затем вы используете цикл For для циклического перемещения по Catalogue.Products и распечатываете каждое имя продукта. Как сохранить данные? Проходит ли он просмотр таблицы Products при загрузке страницы и создает еще один экземпляр класса Product для каждой строки, эффективно копируя всю таблицу в массив класса Product?

Если это так, я думаю, что я создал систему, очень похожую на эту, в том смысле, что есть модуль SiteContent с экземпляром каждого класса Manager - например, есть UserManager, ProductManager, SettingManager и тому подобное. UserManager содержит экземпляр класса User для каждой строки в таблице Users. Они также содержат такие методы, как Create, Update и Remove. Эти менеджеры и их «элементы» создаются при каждой загрузке страницы. Это просто делает удобным и простым доступ к пользователям, продуктам, настройкам и т. Д. На каждой странице, что касается меня, разработчика. Любые последующие страницы, которые мне нужно создать, мне просто нужно сослаться на SiteContent.UserManager, чтобы получить доступ к списку пользователей, а не выполнять запрос внутри этой страницы (т. Е. Этот метод отделяет доступ к данным от работы страницы в так же, как использование кода позади, отделяет работу страницы от того, как она размещена).

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

Мой вопрос в основном заключается в том, выполняет ли моя методика то же самое, что и Linq, в смысле дублирования данных из таблиц в свойства классов.

Заранее спасибо за любые советы или ответы по этому поводу.

С уважением,

Ричард Кларк

Ответы [ 8 ]

9 голосов
/ 19 марта 2010

Linq to SQL не поддерживает копии всех данных в базе данных. Он принимает выражения, которые вы передаете через интерфейсы IQueryable, считывает деревья выражений и преобразует их в действительные операторы SQL, используя WHERE и другие конструкции SQL.

Другими словами, когда вы пишете это:

var product = context.Products.Where(p => p.ID == 50).SingleOrDefault();

Он выполняет это для базы данных:

SELECT ID, Name, Foo, Bar, Baz, Blah, ...
FROM Products
WHERE ProductID = 50

Он не просто делает SELECT * FROM Products, а затем ищет конкретный продукт из результатов.

Ваше приложение будет работать медленно, если вы попытаетесь «загрузить» всю базу данных при каждой загрузке страницы. Это определенно не то, что делает Linq to SQL, Linq to Entities или любая другая платформа ORM.

2 голосов
/ 19 марта 2010

Магия; -)

Нет, но это довольно волшебно. Как работает LINQ, довольно сложно, но я обнаружил, что с LINQ я практически всегда получаю лучшую или равную производительность, а код всегда чище.

Если вы хотите поиграть с LINQ, скачайте LINQPad и просмотрите примеры. Тогда купите книгу Джо Албахари (автора), C ​​# 4.0 В двух словах, для всех кровавых деталей!

2 голосов
/ 19 марта 2010

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

Моя рекомендация: прочитайте серию статей , состоящую из нескольких частей, от "The Gu" - Скотта Гатри - и впитайте все эти мудрости в этих постах.

Большая часть магии скрыта за визуальным дизайнером, который в основном создает «снимок» структур таблицы - но только структур! И он знает, как преобразовать ваши запросы «дай мне эти записи» в прямые запросы T-SQL к серверной части SQL Server. И он преобразует эти реляционные части в красивые объекты .NET.

Достаточно продвинутая технология всегда почти неотличима от магии - но Linq и Linq-to-SQL на самом деле не являются черной магией - просто очень умные кусочки кода от некоторых ярких парней!

1 голос
/ 19 марта 2010

Вам понадобится немного времени, чтобы ознакомиться с синтаксисом LINQ и понять, как извлечь только те данные, которые вам нужны. Я рекомендую скачать LINQPad ... подробные примеры и дать вам хорошую песочницу для игры и промокания ног. Там будет время, чтобы принять участие, когда вы освоите основы ...

0 голосов
/ 20 марта 2010

Linq - это коллекция монад.Как работают монады, описывается теорией категорий.Так что если вы действительно хотите знать, ищите монады.

0 голосов
/ 19 марта 2010

LINQ to SQL похож на многие Object Relationship Mapping решений и создает объекты и коллекции, которые абстрагируют таблицы в объектно-ориентированные объекты. Ваш подход к созданию классов менеджера для разных сущностей немного раздут и легко станет громоздким. Возможно, вы захотите использовать шаблон репозитория и Domain Driven Design , что фактически означает, что вы сгруппируете сущности, которые связаны в пару классов высокого уровня.

0 голосов
/ 19 марта 2010

Поставщик LINQ To SQL находится в сговоре с компилятором C #, интерфейс IQueryable ведет себя немного иначе при компиляции, в отличие от стандарта в коллекции памяти (IEnumerable). Деревья выражений построены, это положение t очень полезно для понимания того, что происходит под одеялом. Поставщик LINQ to SQL принимает выражения, а не функции и действия. Подробности смотрите в сообщении.

0 голосов
/ 19 марта 2010

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

Существуют инструменты, т.е. конструктор или sqlmetal, которые позволяют создавать сопоставление между полями таблицы базы данных и объектной моделью.

В случае отключенной модели, такой как asp.net, вы можете использовать методы присоединения для поддержки обновлений на местах и ​​т. Д.

В настоящее время я читаю действительно хорошую книгу о Linq под названием Linq in Action, которая дает хорошее представление о Linq. Что касается сравнения вашей модели с тем, что делает Linq, вы, возможно, захотите немного почитать, поскольку Linq выполняет довольно много управления между управлением объектами на уровне кода и переводом этого кода на уровень данных.

В Linq to SQL существует слой Expression, который преобразует объектный код в sql с использованием довольно интенсивного поставщика данных.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...