Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架中筛选子实体的最佳方法_C#_.net_Entity Framework_Ef Code First - Fatal编程技术网

C# 在实体框架中筛选子实体的最佳方法

C# 在实体框架中筛选子实体的最佳方法,c#,.net,entity-framework,ef-code-first,C#,.net,Entity Framework,Ef Code First,我没有删除实体。我只是签了他们的名字。问题是当我得到一个父元素时,它的所有子元素都被加载,即使IsDeleted属性为true或false。然后我做了下面的事情,但我想知道有没有更好的方法 var result = from p in context.Set<Product>().Include(x => x.Reviews) select new {

我没有删除实体。我只是签了他们的名字。问题是当我得到一个父元素时,它的所有子元素都被加载,即使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;
var result=来自context.Set()中的p。包括(x=>x.Reviews)
选择新的
{
乘积=x,
ProductReviews=x.ProductReviews.Where(y=>!y.IsDeleted)
};
var products=新列表();
foreach(result.OrderBy(x=>x.product.Id)中的var product.Skip(skipRecords.Take(pageSize))
{
var p=新产品();
p=产品。产品;
p、 ProductReviews=product.ProductReviews.ToList();
产品.加入(p);;
}
退货产品;
如何改进此代码块


感谢

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

如果只有一个类具有
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);
  }
}
公共静态类MyExtensionMethods
{
公共IQueryable筛选器删除(此IQueryable src),其中T:i被删除
{
返回src.Where(x=>!x.IsDeleted);
}
}
因为这是在
IQueryable
上完成的,所以where子句被内置到发送到数据库的查询中,因此在
IsDeleted
为true时不会返回任何记录。因此,在您的示例中,您只需调用
x.ProductReviews.FilterDeleted()

现在,我在其中使用此方法的项目实际上使用的是LINQ2SQL。我自己对EF比较陌生,所以可能有一种更“EF特定”的方法来实现这一点(比如,可能是每层次结构的某种类型),但我只是认为这至少有助于简化查询


希望能有帮助

当你说所有的孩子都是真的或假的时候,你是什么意思?where过滤器是否不工作?或者它加载或者子对象和它们按isDeleted过滤?一些子实体被删除,因此isDeleted属性对它们来说是1。但我只想在实体的IsDeleted属性为0时获取。LOL cat是否命名了该接口?哈哈洛尔。实际上,在我的项目中,属性名为FlagDelete,因此接口名为IHaveFlagDelete。我只是想调整OP的IsDeleted属性,但我猜IHaveIsDeleted是一个听起来很有趣的名字。我装炸弹怎么样?LMAO;)