Может ли linq2sql сделать это без большого количества пользовательского кода?

Я просто окунулась в проект 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 ...

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


person E.J. Brennan    schedule 13.01.2009    source источник


Ответы (3)


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

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

person Cade Roux    schedule 13.01.2009

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

person GeekyMonkey    schedule 13.01.2009

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

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

person tvanfosson    schedule 13.01.2009