簡體   English   中英

EF6關閉延遲加載將返回null

[英]EF6 Turning off Lazy Loading returns null

在將lazyloading設置為false之前。 我的查詢返回了正確的值,但它帶來了一半的數據庫。 我設置了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

關閉延遲加載不會自動為其預加載導航屬性。 為了也獲得導航屬性,您需要在查詢中包括它們

關閉“延遲加載”的問題是,您必須明確告訴您要隨查詢一起填充的導航屬性。

要將導航屬性和謂詞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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM