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()
}
我有一个大型基本查询,我想在各种方法中添加条件 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()
}