linq到sql加载孩子的一对多关系

时间:2012-09-10 15:47:23

标签: c# linq linq-to-sql

我有3张桌子。事件,Rootcauses和IncidentRootCauses。表incidentrootcauses与一对多的事件有关。当我得到Incident对象时,没有像我预期的那样的rootcause对象列表,而是我得到的(在我的立即窗口中)

var rt = incident.IncidentRootCauses;

{System.Data.Linq.EntitySet}     数:1

HasLoadedOrAssignedValues: true

IsDeferred: false

我希望能够在查询运行时加载所有rootcause对象。我知道问题是事件没有明确地绑定到rootcause表。感谢您对此提供任何帮助。

using (var db = new IncidentTrackerDataContext())
            {
                var lo = new DataLoadOptions();
                lo.LoadWith<Incident>(incidents => incidents.ReportedTo);
                lo.LoadWith<Incident>(incidents => incidents.Shift);
                lo.LoadWith<Incident>(incidents => incidents.Machine);
                lo.LoadWith<Incident>(incidents => incidents.Department);
                lo.LoadWith<Incident>(incidents => incidents.IncidentRootCauses);
                lo.LoadWith<IncidentRootCause>(i => i.RootCause);

                // lo.LoadWith<Incident>(incidents => incidents.IncidentManagers);
                // lo.LoadWith<Incident>(incidents => incidents.IncidentMembers);
                // lo.LoadWith<Incident>(incidents => incidents.IncidentWitnesses);
                db.LoadOptions = lo;
                db.DeferredLoadingEnabled = false;
                Incident incident = (from i in db.Incidents
                                     where i.IncidentReportID == new Guid(incidentID)
                                     select i).FirstOrDefault();

                return incident;
            }

2 个答案:

答案 0 :(得分:1)

听起来你也想要第二级渴望加载的实体。

在相同的LoadOptions上,尝试:

lo.LoadWith<IncidentRootCause>(irc => irc.RootCause);

答案 1 :(得分:0)

您可能想要检查生成的SQL。当尝试加载多个子项时,可能会忽略一些带有选项的加载,因为这可能意味着会拉出太多记录。因此,在使用子句已经退出之后,您的某些子记录可能不会被提取。