实体框架核心条件何处发布变量声明[重复]

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

这个问题在这里已有答案:

我对EF和.NET Core有些新意。我来自PHP Framework Laravel,它有一些类似于模型和查询构建的逻辑,但我似乎无法找到我正在寻找的相关文档。

我有一个模型,我想根据表单中的POST数据执行查询,并根据用户的输入过滤结果。

在Laravel中,我能够有条件地为这样的模型构建查询,如下所示:

$projects = Project::when($request->year_from, function($query) use ($request){
    $query->where('delivery_year', '>=', $request->year_from);
})
->when($request->year_to, function($query) use ($request){
    $query->where('delivery_year', '<=', $request->year_to);
})->get();

如果请求包含该特定过滤器的任何数据,我在这里向查询添加了where语句。 EF中的查询模型是否有类似的解决方案?

我开始编写这样的代码,但我清楚地意识到这是一个糟糕的实现,因为我在取消结果之前首先获取整个结果集:

var logs = context.Logs.All();

if( PostData.LogLevel != null )
{
    var logs = logs.Where((log) => log.LogLevel == PostData.LogLevel);
}
c# entity-framework asp.net-core .net-core
1个回答
1
投票

编辑:我刚犯了一个愚蠢的错误。我已经更新了我的代码,感谢@CodeCaster

var logs = context.Log;

IQueryable<Log> q = null
if( PostData.LogLevel != null )
{
   q = logs.Where(log => log.LogLevel == PostData.LogLevel);
}
if( ... ){
   q = q.Where() ; 
}
// ... 

...

var list=await q.ToListAsync();

LINQ是懒惰的,这意味着我们只需定义将在未来执行的表达式树。想想PHP中的lambda函数,在我们显式调用它之前不会执行。直到最后一行ToListAsync(),才会执行上面的代码

© www.soinside.com 2019 - 2024. All rights reserved.