Linq - как это работает?

Я просто изучал Linq с ASP.NET. Это очень аккуратно действительно. Я просто задавался вопросом - как все классы становятся заполненными? Я имею в виду в ASP.NET, предполагаю, что у Вас есть файл Linq под названием Каталог, и Вы затем используете, Чтобы цикл циклично выполнился через Каталог. Продукты и печать каждое Название продукта. Как детали становятся сохраненными? Это просто проходит таблицу продуктов на загрузке страницы и создает другой экземпляр продукта класса для каждой строки, эффективно копируя всю таблицу в массив продукта класса?

Если так, я думаю, что создал систему очень как это, в том смысле, что существует модуль SiteContent с экземпляром каждого класса менеджера - например, существует UserManager, ProductManager, SettingManager и одинаково. UserManager содержит экземпляр Пользовательского класса для каждой строки в таблице Users. Они также содержат методы те, которые Создают, Обновление и Удаляют. Эти менеджеры и их "Объекты" создаются на каждой загрузке страницы. Это просто делает это хорошим и легким пользователям доступа, продуктам, настройки и т.д. на каждой странице, что касается меня, разработчик. Любые любые последующие страницы, которые я должен создать, я просто, должны сослаться на SiteContent. UserManager, чтобы получить доступ к списку пользователей, вместо того, чтобы выполнить запрос из той страницы (т.е. этот метод выделяет доступ к данным от работ страницы, таким же образом как использование кода позади, выделяет работы страницы от того, как страница размечается).

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

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

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

С уважением,

Richard Clarke

5
задан ClarkeyBoy 19 March 2010 в 20:27
поделиться

8 ответов

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.

9
ответ дан 18 December 2019 в 13:12
поделиться

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

1
ответ дан 18 December 2019 в 13:12
поделиться

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

0
ответ дан 18 December 2019 в 13:12
поделиться

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

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

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

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

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

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

0
ответ дан 18 December 2019 в 13:12
поделиться

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

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

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

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

2
ответ дан 18 December 2019 в 13:12
поделиться

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

0
ответ дан 18 December 2019 в 13:12
поделиться

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

0
ответ дан 18 December 2019 в 13:12
поделиться

Магия; -)

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

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

2
ответ дан 18 December 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: