0

次のコードをもっと抽象的に書きたいと思います。

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 -> メソッドの呼び出し時に指定したプロパティを取得する必要があります (おそらく MemberExpression をスローしました)

  3. from x ...TabAccounts -> メソッドを呼び出している EntitySet から DbSet をロードする必要があります

  4. from y in x.TabAccountLangs -> 上記のプロパティである必要があります

抽象化については、このコードを何度もコピー/貼り付けすることを避け、言及された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);

あなたが私を助けてくれることを願っています。前もって感謝します。

4

1 に答える 1

2
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拡張メソッドの使用を検討する必要があります。

于 2013-08-06T12:31:27.983 に答える