0

我没有删除实体。我只是通过 IsDeleted 属性对其进行签名。问题是当我得到一个父元素时,即使 IsDeleted 属性为真或假,它的所有子元素也会被加载。然后我做了类似下面的事情,但我想知道有没有更好的方法呢?

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

我之前为解决这种情况所做的就是创建一个特定的接口来表示像这样“标记已删除”的类,然后创建一个扩展方法来过滤掉它们。

如果您只有一个具有该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);
  }
}

因为这是在 an 上完成的IQueryable<T>,所以 where 子句被内置到发送到数据库的查询中,因此不会返回任何 whereIsDeleted为 true 的记录。因此,您在示例中所要做的就是调用x.ProductReviews.FilterDeleted()

现在,我使用这种方法的项目实际上是在使用 LINQ2SQL。而且我自己对 EF 还很陌生,所以可能有一种更“EF 特定”的方式来执行此操作,(可能是某种类型的 Per Hierarchy 构造,也许?),但我只是认为这至少有助于您的查询更简单。

希望有帮助!;)

于 2013-07-05T17:30:19.650 回答