Linq to Sql - загрузка дочерних объектов без использования DataLoadOptions? - PullRequest
6 голосов
/ 26 октября 2008

Можно ли загрузить дочерние объекты в одном запросе без использования DataLoadOptions?

Я использую один контекст данных для каждого запроса в веб-приложении asp.net и пытаюсь обойти ограничение linq to sql, заключающееся в невозможности изменения допущений данных после выполнения запроса.

Спасибо.

Ответы [ 7 ]

3 голосов
/ 27 октября 2008

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

1 голос
/ 29 октября 2008

В блоге Роба Конери есть способ сделать это с помощью вспомогательного класса, который у него есть, LazyList<T>. Также он использует пользовательские объекты, чтобы избежать проблемы анонимного типа соединения. Я успешно использовал это, чтобы получить родительские дочерние отношения из sql без DataLoadOptions.

Я думаю, что он освещает это либо в Pt2, либо в Pt3 своих видео с MVC Storefront:

http://www.asp.net/learn/mvc-videos/video-351.aspx

http://www.asp.net/learn/mvc-videos/video-352.aspx

Предполагается, что у вас есть POCO с именем Category (не сущность linq) и класс LazyList:

var categories = (from c in _db.Categories
                  select new Category
                  {
                  CategoryID = c.CategoryID,
                  CategoryName = c.CategoryName,
                  ParentCategoryID = c.ParentCategoryID,
                  SubCategories = new LazyList<Category>(
                       from sc in _db.Categories
                       where sc.ParentCategoryID == c.CategoryID
                       select new Category
                       {
                            CategoryID = sc.CategoryID,
                            CategoryName = sc.CategoryName,
                            ParentCategoryID = sc.ParentCategoryID
                        })
                    });
1 голос
/ 29 октября 2008

Я нашел следующий пример vb.net, который вручную заполняет дочерние объекты из типа IMultipleResults:

   Public Function GetSubjectsWithBooks() As List(Of Subject)
        Dim results As IMultipleResults = Me.GetSubjectAndBooks
        Dim Subjects = results.GetResult(Of Subject).ToList
        Dim Books = results.GetResult(Of Book).ToList
        For Each s In Subjects
            Dim thisId As Guid = s.ID
            s.FetchedBooks = (From b In Books Where b.SubjectId = thisId).ToList
        Next
        Return Subjects
    End Function

Это было взято из примера проекта, написанного Джимом Вули (одним из авторов Link in Action), который можно найти по адресу: http://www.thinqlinq.com/Downloads/LinqToSqlBeyondTheBasics.zip

Омер, это та техника, о которой ты говорил?

0 голосов
/ 06 ноября 2008

Используйте Включить ...

var q = from u в context.Users.Include ("address") ...

Также приведет к заполнению адреса дочернего объекта.

0 голосов
/ 27 октября 2008

Если ваша коллекция EntitySet , вы можете загрузить ее методом .Load ():

Person p = ctx.Persons.First();
p.Addresses.Load();
0 голосов
/ 27 октября 2008

А как насчет объединений? E.g.:

from a in Albums join  o in Users on a.Owner equals o select new {a, o}
0 голосов
/ 26 октября 2008

Дочерние объекты будут загружены при первом обращении к ним, поэтому вы можете заставить Linq загрузить Sql, чтобы загрузить их, обратившись к ним ... :-) Но я не думаю, что это то, о чем вы думали.

Какова ваша ситуация? У вас есть дочерние сущности, хранящиеся в той же таблице, что и родительская сущность, и вы хотите получить их все, используя один запрос?

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