【发布时间】:2008-10-26 19:43:38
【问题描述】:
是否可以在单个查询中加载子实体而不使用 DataLoadOptions?
我在 asp.net Web 应用程序中为每个请求使用一个数据上下文,并试图绕过 linq to sql 限制,即一旦执行查询就无法更改 dataloadoptions。
谢谢。
【问题讨论】:
标签: .net linq linq-to-sql
是否可以在单个查询中加载子实体而不使用 DataLoadOptions?
我在 asp.net Web 应用程序中为每个请求使用一个数据上下文,并试图绕过 linq to sql 限制,即一旦执行查询就无法更改 dataloadoptions。
谢谢。
【问题讨论】:
标签: .net linq linq-to-sql
如果您不介意链接到数据上下文,正如您所说的那样,您可以编写一个存储过程来返回映射到您的对象的多个结果。 Read more about it here.
【讨论】:
我发现了以下 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,这就是你所指的技术吗?
【讨论】:
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
})
});
【讨论】:
子实体将在您第一次访问它们时加载,因此您可以通过访问它们来强制 Linq to Sql 加载它们... :-) 但我不认为这是您的想法。
你的情况如何?您是否将子实体与父实体存储在同一个表中,并希望使用一个查询来获取所有子实体?
【讨论】:
连接呢?例如:
from a in Albums join o in Users on a.Owner equals o select new {a, o}
【讨论】:
如果您的集合是 EntitySet,那么您可以通过 .Load() 方法加载它:
Person p = ctx.Persons.First();
p.Addresses.Load();
【讨论】:
使用包含...
var q = from u in context.Users.Include("address")...
也会导致地址子对象被填充。
【讨论】: