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



我有一个大的基本查询,我想在各种方法中添加条件Where过滤器。我希望使用LazyLoading在一个方法中创建基本查询,并在我添加条件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()
}

上面没有返回任何结果,但如果我把所有东西都放在一个大方法中,那么它就完成了我想要它做的事情。我的实际设计可能有7个左右不同的方法可以调用"基本"查询,我试图避免在每个方法中复制基本查询,以1(可读性;2(如果需要编辑查询以添加更多字段,则进行持续维护。

这两条注释指出了代码的两个问题。使用IEnumerable将在评估额外的查询谓词之前运行查询,并在内存中对其进行评估。其次,.Where不会使IQueryable/IENumberable发生突变,它返回一个新的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()
}

最新更新