Linq to Sql - 在不使用DataLoadOptions的情况下加载子实体?

时间:2008-10-26 19:43:39

标签: .net linq linq-to-sql

是否可以在不使用DataLoadOptions的情况下在 查询中加载子实体?

我在asp.net Web应用程序中为每个请求使用一个数据上下文,并尝试绕过linq to sql限制,一旦执行查询就无法更改dataloadoptions。

感谢。

7 个答案:

答案 0 :(得分:3)

如果您不介意数据上下文的链接,正如您所说的那样,您可以编写一个存储过程,该过程返回映射到您的对象的多个结果。 Read more about it here

答案 1 :(得分:1)

我找到了以下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

这取自Jim Wooley(Link in Action作者之一)撰写的示例项目,该项目可在以下网址找到:http://www.thinqlinq.com/Downloads/LinqToSqlBeyondTheBasics.zip

Omer,这是你指的技术吗?

答案 2 :(得分:1)

Rob Conery's blog可以使用他拥有的帮助程序类LazyList<T>。他还使用自定义对象来避免加入匿名类型问题。 我已成功使用它来从没有DataLoadOptions的sql获取父子关系。

我认为他在他的MVC店面视频的Pt2或Pt3中都有它:

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

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

这假设你有一个名为Category(不是linq实体)的POCO和一个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
                        })
                    });

答案 3 :(得分:0)

当您第一次访问子实体时,它们将被加载,因此您可以强制Linq通过访问它们来加载它们...... :-)但我不认为这就是您的想法。

你的情况如何?您是否将子实体存储在与父实体相同的表中,并希望使用一个查询来获取它们?

答案 4 :(得分:0)

加入怎么样? E.g:

from a in Albums join  o in Users on a.Owner equals o select new {a, o}

答案 5 :(得分:0)

如果您的集合是 EntitySet ,那么您可以通过.Load()方法加载它:

Person p = ctx.Persons.First();
p.Addresses.Load();

答案 6 :(得分:-1)

使用包含...

var q = from context inUther.Users.Include(“address”)...

也会导致填充地址子对象。