0

特定のエンティティを含めることができるように、include ステートメントのコレクションをリポジトリに渡す方法を見つけようとしています。以下は私のリポジトリからのサンプルコードです。

   public TEntity GetById(Guid id)
        {
            return id != Guid.Empty ? GetSet().Find(id) : null;
        }
   private IDbSet<TEntity> GetSet()
            {
                return _unitOfWork.CreateSet<TEntity>();
            }

GetByID メソッドは、GetSet を呼び出してエンティティ セットを返します。GetById の一部として (式を介して) エンティティのコレクションを渡すことができれば、GetSet をサービスに公開する必要がなくなると考えていました。したがって、次のようなものです。

var entity = _repository.GetById(theId, e => {e.Prop1, e.Prop2, e.Prop3});

次に、その式を GetSet メソッドに渡し、それを include ステートメントに渡すことができます。考え?

4

4 に答える 4

17

私は最近、私のコードでこのようなことをしました。次のことはあなたのために働きますか?

public TEntity GetById(Guid id, params Expression<Func<TEntity, object>>[] includeProperties)
    {
        if (id == Guid.Empty) return null;

        var set = _unitOfWork.CreateSet<TEntity>();
        foreach(var includeProperty in includeProperties)
        {
             set.Include(includeProperty);
        }
        return set.First(i => i.Id == id);
    }

それならあなたはそれをこのように呼ぶでしょう...

var entity = _repository.GetById(theId, e => e.Prop1, e=> e.Prop2, e=> e.Prop3);

これがあなたのパターンに正確に従わないことは知っていますが、必要に応じてリファクタリングできると思います。

于 2011-08-26T17:33:14.330 に答える
8

PaigeCookのコードが示されているようにうまく機能するとは思わない。

代わりに機能するはずのコードの修正バージョンを含めました。

public TEntity GetById(Guid id, params Expression<Func<TEntity, object>>[] includeProperties)
{
    if (id == Guid.Empty) return null;

    IQueryable<TEntity> set = _unitOfWork.CreateSet<TEntity>();

    foreach(var includeProperty in includeProperties)
    {
         set = set.Include(includeProperty);
    }
    return set.First(i => i.Id == id);
}

Entity Frameworkによって生成されたSQLをトレースすることでこれを見つけただけで、元のコードは、遅延読み込みを使用して含めるように指定されたエンティティにデータを入力することで、動作しているように見せかけるだけであることがわかりました。

LINQ Aggregateメソッドを使用してIncludeステートメントを適用するためのより簡潔な構文が実際にあります。これは、にリンクされているブログ投稿にあります。私の投稿では、インクルードが不要な場合にFindメソッドにフォールバックすることでメソッドを少し改善し、同様の構文を使用して「GetAll」メソッドを実装する方法の例も示しています。

于 2012-05-05T16:19:46.577 に答える
1

多くの理由から、コンテキストを非ローカル空間に保存することはお勧めできません。

Steve のコードを変更し、ASP.NET MVC プロジェクト用にこれを取得します。

public aspnet_User FirstElement(Func<aspnet_User, bool> predicate = null, params Expression<Func<aspnet_User, object>>[] includes)
    {
        aspnet_User result;
        using (var context = new DataContext())
        {
            try
            {
                var set = context.Users.AsQueryable();

                for (int i = 0; i < includes.Count(); i++ )
                    set = set.Include(includes[i]);

                if (predicate != null)
                    result = set.ToList().FirstOrDefault(predicate);
                else
                    result = set.ToList().FirstOrDefault();
            }
            catch
            {
                result = null;
            }
        }

        return result;
    }
于 2015-01-14T11:32:21.880 に答える
0

includeメソッドは、次のようにlinqクエリでつなぎ合わせることができます。

var result = (from i in dbContext.TableName.Include("RelationProperty")
                                           .Include("RelationProperty")
                                           .Include("RelationProperty")
                select i);
于 2011-08-26T15:43:32.953 に答える