2014-09-30 108 views
0

我想要访问我的RegisterCountLog上的Register导航属性。由于某些原因,它始终为空。所以当我尝试访问RegisterName时,它始终为空。EF导航属性包括不加载

public IQueryable<RegisterCountLog> GetCountsForDevice(long deviceSerial) 
{ 
    return this.ServiceCollection.GetAll(c => c.Register) 
       .Where(c => c.DeviceSerial == deviceSerial).AsNoTracking(); 
} 

注意ServiceCollection.GetAll()将(或应该)包括Register。又名queryableLogs特定位之后查询中使用像这样

SELECT 
    [Extent2].[Contribution] AS [Contribution], 
    [Extent1].[DeviceSerial] AS [DeviceSerial], 
    [Extent1].[LogEntryID] AS [LogEntryID], 
    [Extent1].[RegisterId] AS [RegisterId], 
    [Extent1].[Value] AS [Value], 
    [Extent1].[Timestamp] AS [Timestamp], 
    [Extent2].[RegisterId] AS [RegisterId1], 
    [Extent2].[DeviceSerial] AS [DeviceSerial1], 
    [Extent2].[RegisterName] AS [RegisterName], 
    [Extent2].[ZoneEntrance_ZoneEntranceID] AS [ZoneEntrance_ZoneEntranceID] 
    FROM [dbo].[RegisterCountLogs] AS [Extent1] 
    INNER JOIN [dbo].[Registers] AS [Extent2] 
      ON ([Extent1].[RegisterId] = [Extent2].[DeviceSerial]) 
      AND ([Extent1].[DeviceSerial] = [Extent2].[RegisterId]) 

它:

var queryableLogs = countLogService.GetCountsForDevice(serialNumber); 
var groupedLogs= gLogs 
    .Select(r => new Register 
    { 
     RegisterId = r.FirstOrDefault().RegisterId, 
     RegisterName = r.FirstOrDefault().Register.RegisterName, // Here! 
     DeviceSerial = r.FirstOrDefault().DeviceSerial, 
     CountLogs = r.GroupBy(rc => 
           new {Day = SqlFunctions 
             .DatePart("dy", rc.Timestamp)}) 
        .Select(rl => new RegisterCountLog() 
            { 
            Value = rl.to FirstOrDefault().Value, 
            Timestamp = rl.FirstOrDefault() 
                .Timestamp, 
            }) 
        .OrderByDescending(l => l.Timestamp) 
        .ToList() 
    }) 
    .Where(r=>r.CountLogs.Count() > 0) 
    .OrderByDescending(r => r.RegisterId) 
    .ToList(); 

一切完美,除了RegisterName总是空。如果我查看查询Register也是空的。为什么不被加载?

这里是EF类

public class RegisterCountLog 
{ 
    [Key, Column(Order = 1)] 
    [ForeignKey("Register")] 
    public long DeviceSerial { get; set; } 

    [Key, Column(Order = 2)] 
    public long LogEntryID { get; set; } 

    [Key, Column(Order = 3)] 
    [ForeignKey("Register")] 
    public long RegisterId { get; set; } 

    public long Value { get; set; } 

    public DateTime Timestamp { get; set; } 

    public Register Register { get; set; } 
} 

public class Register 
{ 
    public enum ContributionType 
    { 
     FlowIn, 
     FlowOut 
    } 

    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    [Key, Column(Order = 1)] 
    public long RegisterId { get; set; } 

    [Key] 
    [ForeignKey("Device"), Column(Order = 2)] 
    public long DeviceSerial { get; set; } 

    [StringLength(50)] 
    public string RegisterName { get; set; } 

    public ContributionType Contribution { get; set; }  

    public virtual Device Device { get; set; } 
} 
+1

将寄存器虚拟为启用延迟加载或在将您的RegisterCountLog集合提取到加载时使用'.Include(x => x.Register)'方法。 – 2014-09-30 13:21:38

+0

'.GetAll()'应该预加载它(即时通讯使用存储库模式),我也尝试过虚拟,但没有工作..我再试一次以防万一 – Chris 2014-09-30 13:24:13

回答

0

也许你正在使用预先加载,你必须指定.Include(x => x.Register).Include("Register"),取决于你的EF版本

如果你被点名了你的变量很大可能存在另一个问题(急切的加载对分组的东西不是很好)。一种方法是在选择某个事物之前列举查询(列出)。 (如果没有性能问题)

编辑:我看了你以前的评论,我真的觉得是该集团通过发行(集团通过改变你的LINQ结构,包括不工作anympore)

方法是这样的:

var groupedPersons  = db.Appointments 
         .Include_Service() 
         .Include_Location() 
         .Include_Room() 
         .IncludeEhr_Patient() 
         .IncludeEhr_Person() 
         .IncludeEhr_Personal() 
         .ToList() // see that i enumerate before i group by 
         .GroupBy(x => x.PersonId).Select()[.ToList()]