实体框架返回延迟加载查询并在另一种方法中应用过滤器

问题描述 投票:0回答:1

我有一个大型的基础查询,我想在各种方法中添加条件式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.Where(x => x.Field1 == "Field1Value");
    }
    if(condition2 is true)
    {
        model.Where(x => x.Field2 == "Field2Value");
    }

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

上面没有返回结果,但是如果我将所有内容都放在一个大方法中,那么它将按照我想要的去做。我的实际设计可能有7种左右的方法将调用“基本”查询,而我试图避免在每种方法中复制基本查询,以实现1)可读性和2)持续维护(如果需要将查询编辑为)添加更多字段。

c# entity-framework linq-to-entities lazy-loading
1个回答
0
投票

这两个注释指向代码的两个问题。使用IEnumerable将在评估其他查询谓词之前运行查询,并将在内存中对它们进行评估。其次,.Where不更改IQueryable / IEnumerable,它返回新的IQueryable / IEnumerable。

所以应该是这样的:

public IQueryable<MyModel> GetBaseQuery()
{

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

public ICollection<MyModel> GetResultsByKeyword()
{
    IQueryable<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()
}
© www.soinside.com 2019 - 2024. All rights reserved.