2015-09-16 3 views
0

, прежде чем установить lazyloading на false. Мой запрос вернул правильные значения, но он принес с собой половину БД. Я установил lazyloading = false, и я удалил «Виртуальный» с обеих моделей. Но все же он возвращает Null. Вот моя кода: LINQ заявлениеEF6 Отключение Lazy Loading возвращает

public BasePremiumNotional GetBasePremiumNotional(int productVersionId, int bedrooms, string propertyType, int? startYear, int? endYear, DateTime version) 
{ 
      BasePremiumNotional basePremiumNotional = 
       GetSingle(t => t.ProductVersionId == productVersionId) 
        .BasePremiumNotionals.FirstOrDefault(
         g => g.NoOfBedrooms == bedrooms && g.PropertyType == propertyType && g.StartYear == startYear && g.EndYear == endYear && g.Version == version.Date); 
      return basePremiumNotional; 
} 

GetSingle метод, чтобы сделать фактический вызов:

public T GetSingle(Expression<Func<T, bool>> predicate) 
{ 
    var query = _entities.Set<T>().FirstOrDefault(predicate); 
    return query; 
} 

В этом случае T является родительским объект ProductVersion и дочерний объект является BasePremiumNotionals

ответ

0

Проблема с выключением Lazy Loading заключается в том, что вы должны явно указать, какие свойства навигации вы хотите заполнить вместе с вашим запросом.

Для Include свойства навигации вместе с предикатом, вы можете сделать:

public T GetSingle<T>(Expression<Func<T, bool>> predicate, 
       params Expression<Func<T, object>>[] navigationProperties) 
    {    
     IQueryable<T> query = _entities.Set<T>(); 
     foreach (var navigationProperty in navigationProperties) 
     { 
      query = query.Include(navigationProperty); 
     } 
     return query.FirstOrDefault(predicate); 
    } 

И если предположить сущность, которая выглядит следующим образом:

public class FooBar 
    { 
     public int ProductVersionId { get; set; } 

     public ICollection<BasePremiumNotional> BasePremiumNotionals { get; set; } 
    } 

Вы можете использовать его в качестве такового:

var foo = GetSingle<FooBar>(t => t.ProductVersionId == productVersionId, 
         n => n.BasePremiumNotionals) 
+0

Когда я меняю функцию на красную строку IDE этого VS's 'navigationProperty' в инструкции Include, поскольку она не может решить, должна ли она быть' System.Data.Entity' или 'System.Linq.IQueryable'. – bilpor

+0

@bilpor исправил ошибку компиляции. также сделал второй аргумент 'params' array –

+0

@Aditaya Santoso. Можете ли вы привести мне пример того, как я построил бы вызов этого метода, исходя из моего первоначального сообщения. У меня возникли проблемы с созданием второго параметра для метода. – bilpor

2

Поворот ленивой загрузки не будет автоматически загружать навигационные свойства. Для получения свойств навигации вам также понадобится Include them в вашем запросе.

+0

Я смотрел эту ссылку, но я не могу добавить предикат. Поэтому в методе 'GetSingle' я начинаю с:' var query = _entities.Set (); ', но если я продолжу с' _entities.Entry (query) .Collection (предикат) .Load(); 'ничего не нравится predicate – bilpor