EF6关闭延迟加载返回null

本文关键字:返回 null 延迟加载 EF6 | 更新日期: 2023-09-27 18:12:53

,然后将lazyloading设置为false。我的查询返回了正确的值,但它带来了一半的DB。我设置了lazyloading = false,并从两个模型中删除了"虚拟"。但它仍然返回Null。下面是我的代码:linq语句

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

EF6关闭延迟加载返回null

关闭延迟加载不会自动预加载导航属性。为了获得导航属性,您需要在查询中包含它们。

关闭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)