是否可以在不使用DataLoadOptions的情况下在 单 查询中加载子实体?
我在asp.net Web应用程序中为每个请求使用一个数据上下文,并尝试绕过linq to sql限制,一旦执行查询就无法更改dataloadoptions。
感谢。
答案 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”)...
也会导致填充地址子对象。