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
关闭延迟加载不会自动预加载导航属性。为了获得导航属性,您需要在查询中包含它们。
关闭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)