簡體   English   中英

EF 5.0-加載T的集合

[英]EF 5.0 - Loading collections of T

我想將下面的代碼寫得更加抽象。

private void LoadRelatedData(TabAccount tabAccount)
{
    if (ConxCore.Instance.EntityModel.Entry(tabAccount).Collection(x => x.TabAccountLangs).IsLoaded == false)
    {
        var list = (from x in ConxCore.Instance.EntityModel.TabAccounts
            from y in x.TabAccountLangs
            select y).ToList();
    }
}

我想抽象的部分如下:

  1. .Entry(tabAccount) ->應該接受每個EntitySet

  2. x => x.TabAccountLangs- >應該采用我在調用Method時指定的屬性(也許拋出MemberExpression)

  3. 從x ... TabAccounts- >應該從EntitySet加載DbSet我正在使用

  4. 從x.TabAccountLangs中的y- >應該是上面的屬性

關於抽象,我只是想避免一遍又一遍地復制/粘貼此代碼,而只是更改提到的4點,很高興能夠在給定參數的情況下調用此方法,而該方法完成了其余工作。

所以代替:

private void LoadRelatedData(TabAccount tabAccount)
{
    if (ConxCore.Instance.EntityModel.Entry(tabAccount).Collection(x => x.TabAccountLangs).IsLoaded == false)
    {
        var list = (from x in ConxCore.Instance.EntityModel.TabAccounts
            from y in x.TabAccountLangs
            select y).ToList();
    }
}

private void LoadRelatedData(TabElement tabElement)
{
    if (ConxCore.Instance.EntityModel.Entry(tabElement).Collection(x => x.TabElementLangs).IsLoaded == false)
    {
        var list = (from x in ConxCore.Instance.EntityModel.TabElements
            from y in x.TabElementLangs
            select y).ToList();
    }
}

像這樣(僅偽代碼):

private void LoadRelatedData(object obj, object collection, object dbSetOfObj)
{
    if (ConxCore.Instance.EntityModel.Entry(obj).Collection(x => x.collection).IsLoaded == false)
    {
        var list = (from x in ConxCore.Instance.EntityModel.dbSetOfObj
            from y in x.collection
            select y).ToList();
    }
}

並調用此方法:

LoadRelatedData(tabAccount, TabAccountLangs, TabAccounts);
LoadRelatedData(tabElement, TabElementLangs, TabElements);

希望你能幫助我。 提前致謝。

using System.Data.Entity; // For the Include extension method.

private void LoadRelatedData<TEntity, TRelated>(TEntity entity, Expression<Func<TEntity, ICollection<TRelated>> navigationProperty)
    where TEntity : class
    where TRelated : class
{
    if (!ConxCore.Instance.EntityModel.Entry(entity).Collection(navigationProperty).IsLoaded) 
    {
        var list = ConxCore.Instance.EntityModel.Set<TEntity>().Include(navigationProperty).ToList();
    }
}

然后,您可以通過編寫以下內容來調用它:

LoadRelatedData(tabAccount, ta => ta.TabAccountLangs);
LoadRelatedData(tabElement, te => te.TabElementLangs);

但是,您知道這樣的調用將加載所有相關數據,對於任何x? 也就是說,您可能會以非特別優化的方式加載大量數據。 如果只想加載單個實體的相關數據,則可以從Collection調用返回的對象中加載集合:

private void LoadRelatedDataOfSingleObject<TEntity, TRelated>(TEntity entity, Expression<Func<TEntity, ICollection<TRelated>> navigationProperty)
    where TEntity : class
    where TRelated : class
{
    var collectionEntry = ConxCore.Instance.EntityModel.Entry(entity).Collection(navigationProperty);
    if (!collectionEntry.IsLoaded) collectionEntry.Load();
}

但是,如果要加載許多對象的數據,則應考慮使用Include擴展方法之一

暫無
暫無

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

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