Entity Framework Return 在另一种方法中延迟加载查询和应用过滤器

Entity Framework Return Lazy Loading Query and Apply Filters in Another Method

我有一个大型基本查询,我想在各种方法中添加条件 Where 过滤器。我希望使用延迟加载在一个方法中创建基本查询,并在我添加条件 where 子句的各个地方的其他地方调用它,然后在最后执行。

我试过类似的方法:

public IEnumerable<MyModel> GetBaseQuery()
{

    IEnumerable<MyModel> base= context.MyTable1.Join(...{lot of joins here})
        .Select{
        ...select all of required fields for my model
        }
    return base;
}

public IEnumerable<MyModel> GetResultsByKeyword()
{
    IEnumerable<MyModel> model= GetBaseQuery();
    if(condition1 is true)
    {
        model = model.Where(x => x.Field1 == "Field1Value");
    }
    if(condition2 is true)
    {
        model = model.Where(x => x.Field2 == "Field2Value");
    }

    return model.Tolist(); //execute the query when calling ToList()
}

上面的returns没有结果,但是如果我把所有的东西都放在一个大方法中,那么它就会做我想做的事。我的实际设计可能有 7 种左右不同的方法会调用 'base' 查询,我试图避免在每种方法中复制基本查询,以实现 1) 可读性和 2) 如果需要查询,则进行持续维护编辑以添加更多字段。

这两条评论指出了代码的两个问题。使用 IEnumerable 将 运行 在评估附加查询谓词之前查询,并且它们将在内存中进行评估。其次 .Where 不会改变 IQueryable/IEnumerable,它 returns 一个新的 IQueryable/IEnumerable.

所以应该是这样的:

public IQueryable<MyModel> GetBaseQuery()
{

    var base = context.MyTable1. . . .
    return base;
}

public ICollection<MyModel> GetResultsByKeyword()
{
    IQueryable<MyModel> qry = GetBaseQuery();
    if (condition1 is true)
    {
        qry = qry.Where(x => x.Field1 == "Field1Value");
    }
    if (condition2 is true)
    {
        qry = qry.Where(x => x.Field2 == "Field2Value");
    }

    return qry.Tolist(); //execute the query when calling ToList()
}