【问题标题】:Linq to Sql - Loading Child Entities Without Using DataLoadOptions?Linq to Sql - 在不使用 DataLoadOptions 的情况下加载子实体?
【发布时间】:2008-10-26 19:43:38
【问题描述】:

是否可以在单个查询中加载子实体而不使用 DataLoadOptions?

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

谢谢。

【问题讨论】:

    标签: .net linq linq-to-sql


    【解决方案1】:

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

    【讨论】:

    • Omer:我知道您可以返回多个结果集,但您能否返回已填充子实体的实体?谢谢。
    • 是的。只需选择您想要的特定实体并返回它们。您在我提供的链接中有一个示例。
    【解决方案2】:

    我发现了以下 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,这就是你所指的技术吗?

    【讨论】:

    • 是的。我不知道谁对我投了反对票,但这就是我谈论并与之相关的内容。这几乎是您能得到的最佳答案。
    【解决方案3】:

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

    我认为他在他的 MVC Storefront 视频的 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
                            })
                        });
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        连接呢?例如:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            使用包含...

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

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

            【讨论】:

            • Chmad,Include() 不是 LINQ to SQL 的一部分,它在实体框架中可用。
            猜你喜欢
            • 2010-10-26
            • 2012-03-02
            • 1970-01-01
            • 2011-02-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-04
            • 1970-01-01
            相关资源
            最近更新 更多