我不是在删除实体。我只是通过IsDeleted属性签名。问题是,当我得到一个父元素时,即使IsDeleted propery为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;
如何改进此代码块?
由于
答案 0 :(得分: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);
}
}
因为这是在IQueryable<T>
上完成的,所以where子句会内置到发送到数据库的查询中,因此在IsDeleted
为真的情况下不会返回任何记录。因此,您在示例中所要做的就是调用x.ProductReviews.FilterDeleted()
。
现在,我使用此方法的项目实际上是使用LINQ2SQL。而且我自己对EF很新,所以可能会有一种更“特定于EF”的方式来实现这一点,(或许可能是某种类型的每层次结构,也许?),但我只是认为这至少会有助于制作你的查询更简单。
希望有所帮助! ;)