0

私はエンティティを削除していません。IsDeleted プロパティで署名するだけです。問題は、親要素を取得すると、IsDeleted プロパティが true または false であっても、すべての子要素が読み込まれることです。それから私は以下のようなことをしましたが、それを行うためのより良い方法があることを知りたいですか?

var result = from p in context.Set<Product>().Include(x => x.Reviews)
                        select new
                             {
                                 Product = x,
                                 ProductReviews = x.ProductReviews.Where(y => !y.IsDeleted)
                             };

 var products = new List<Product>();

            foreach (var product in result.OrderBy(x => x.Product.Id).Skip(skipRecords).Take(pageSize))
            {
                var p = new Product();
                p = product.Product;
                p.ProductReviews = product.ProductReviews.ToList();

                products.Add(p);
            }

return products;

このコードブロックを改善するには?

ありがとう

4

1 に答える 1

2

この種の状況に対処するために以前に行ったことは、このように「フラグが削除された」クラスを示す特定のインターフェイスを作成し、それらを除外する拡張メソッドを作成することでした。

プロパティを持つクラスが 1 つしかIsDeletedない場合は、別のインターフェイスは必要なく、代わりにクラスを使用できます。しかし、ここでは、複数のクラスがあり、インターフェイスが必要であると仮定します。

したがって、インターフェースは次のように定義されます。

public interface IHaveIsDeleted
{
  public bool IsDeleted { get; set; }
}

次に、私の拡張メソッドは次のように静的クラスで定義されます。

public static class MyExtensionMethods
{
  public IQueryable<T> FilterDeleted(this IQueryable<T> src) where T : IHaveIsDeleted
  {
    return src.Where(x => !x.IsDeleted);
  }
}

これは で行われるIQueryable<T>ため、データベースに送信されるクエリに where 句が組み込まれるため、 where IsDeletedis true が返されるレコードはありません。したがって、この例で行う必要があるのは call だけx.ProductReviews.FilterDeleted()です。

さて、私がこの方法を使用していたプロジェクトは、実際には LINQ2SQL を使用していました。そして、私はEF自身はかなり新しいので、これを行うためのより「EF固有の」方法があるかもしれません(おそらく、ある種のタイプごとの階層構造のように?)が、これは少なくとも作るのに役立つと思いましたクエリがより簡単になります。

それが役立つことを願っています! ;)

于 2013-07-05T17:30:19.650 に答える