Может ли linq2sql сделать это без большого количества пользовательского кода? - PullRequest
2 голосов
/ 14 января 2009

Просто окунулся в проект Linq2sql после нескольких лет катания моих собственных процедур доступа к БД SQL Server.

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

Очень простой пример:

У меня есть две таблицы: Person и Notes, с отношением 1 ко многим (1 Person, много заметок), связанные Person.ID-> Note.PersonID.

У меня есть хранимая процедура (весь доступ к данным осуществляется через SP, и я планирую продолжить это), что делает Link2SQL немного более эффективной для меня.

sp_PersonGet (@ID int) , который возвращает запись о человеке, и sp_PersonNotesGet (@PersonID) , которая возвращает набор связанных заметок для этого человека.

Пока все хорошо, у меня есть объект:

Dim myPerson As Person = db.PersonGet(pnID).Single

и я могу получить доступ к своим полям: myPerson.Name, myPerson.Phone и т. Д.


и я также могу сделать

Dim myNotes As Notes = db.PersonNotesGet(pnID) 

, чтобы получить набор заметок, и я могу перебрать этот список как:

For Each N As Note In myNotes
  ( do something)
Next

Это все отлично работает ... НО .... Я бы предпочел, чтобы, если я позвоню:

  myPerson = db.PersonGet(pnID)

что я также получаю коллекцию myPerson.Notes, которую я могу повторить.

For Each N As Note In myPerson.Notes
  ( do something)
Next

Обычно Linq2SQl должен вызывать 2 хранимые процедуры каждый раз, когда создается запись Person ...

Это выполнимо "из коробки", или мне нужно кое-что написать для себя?

Ответы [ 3 ]

3 голосов
/ 14 января 2009

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

http://davidhayden.com/blog/dave/archive/2009/01/08/QuickExamplesLINQToSQLPerformanceTuningPerformanceProfilingORMapper.aspx

http://www.thinqlinq.com/default/Fetching-child-records-using-Stored-Procedures-with-LINQ-to-SQL.aspx

2 голосов
/ 14 января 2009

Используются частичные классы. Вы можете добавить свое собственное свойство «Заметки» в свой класс Person и инициализировать его в его функции GETter. Это было бы лучше, чем заполнять записи каждый раз, когда вы загружаете личную запись.

0 голосов
/ 14 января 2009

Я считаю, что вы можете сделать это более или менее из коробки, хотя я не пробовал - я не использую хранимые процедуры с LINQ. Что вам нужно сделать, это изменить методы вставки / удаления / обновления с использованием среды выполнения для использования ваших хранимых процедур. Затем вы создадите ассоциацию между двумя вашими таблицами сущностей, которая создаст EntitySet of Notes для класса Person и EntityRef of Person для класса Notes. Вы можете настроить его для автоматической загрузки или отложенной загрузки.

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

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