2014-09-30 11 views
0

Я пытаюсь получить доступ к навигационной собственности Register на моем RegisterCountLog .. По какой-то причине он всегда равен нулю. Поэтому, когда я пытаюсь получить доступ к RegisterName, он всегда равен нулю.EF navigation property include не загружается

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 тоже имеет значение null. Почему он не загружается?

Вот классы 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

Сделать зарегистрировать виртуальный, чтобы позволить отложенной загрузки или использовать '.INCLUDE (х => x.Register)' метода при извлечении вашей коллекции 'RegisterCountLog' для нетерпеливого нагрузки. –

+0

'.GetAll()' должен предварительно загрузить его (im используя шаблон репозитория), я тоже пробовал с виртуальным, но это не сработало. Повторите попытку на всякий случай – Chris

ответ

0

Возможно, вы используете жадную загрузку, и вы должны указать .Include(x => x.Register) или .Include("Register"), зависит от EF версии

Если вы назвали переменные большой может быть другой вопрос (нетерпеливая загрузка не очень хороша в сгруппированных вещах). Один из подходов состоит в том, чтобы перечислить запрос (список) перед тем, как выбрать что-либо. (Если нет проблем с производительностью)

EDIT: как я прочитал ваш предыдущий комментарий, я действительно думаю, что это группа по вопросу (группы по изменению своей структуры 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()] 

 Смежные вопросы

  • Нет связанных вопросов^_^