【问题标题】:Best Way To Filtering Child Entities In Entity Framework在实体框架中过滤子实体的最佳方法
【发布时间】:2013-07-05 14:34:04
【问题描述】:

我没有删除实体。我只是通过 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;

如何改进这个代码块?

谢谢

【问题讨论】:

  • 当你说所有的孩子都加载甚至是真或假时,你是什么意思? where 过滤器不起作用吗?或者它加载或孩子和他们过滤isDeleted?
  • 一些子实体被删除,因此 IsDeleted 属性为它们的 1。但我只想在实体的 IsDeleted 属性为 0 时获取。

标签: c# .net entity-framework ef-code-first


【解决方案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&lt;T&gt; 上完成的,所以 where 子句会内置到发送到数据库的查询中,因此不会返回任何 IsDeleted 为真的记录。因此,在您的示例中,您只需调用 x.ProductReviews.FilterDeleted()

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

希望对您有所帮助! ;)

【讨论】:

  • “LOL cat”是否命名了那个接口?哈哈
  • 哈哈。实际上,在我的项目中,该属性称为 FlagDelete,因此该接口称为 IHaveFlagDelete。我只是想为 OP 的 IsDeleted 属性调整它,但我猜 IHaveIsDeleted 是一个听起来很有趣的名字。 IHasSetUpTheBomb 怎么样? LMAO ;)
猜你喜欢
  • 1970-01-01
  • 2015-05-10
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多