Post 变量上的实体框架核心条件Where 语句

Ole*_*set 1 c# entity-framework .net-core asp.net-core

我对 EF 和 .NET Core 有点陌生。我来自 PHP 框架 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();
Run Code Online (Sandbox Code Playgroud)

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

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

var logs = context.Logs.All();

if( PostData.LogLevel != null )
{
    var logs = logs.Where((log) => log.LogLevel == PostData.LogLevel);
}
Run Code Online (Sandbox Code Playgroud)

itm*_*nus 5

编辑:我刚刚犯了一个愚蠢的错误。感谢@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();
Run Code Online (Sandbox Code Playgroud)

LINQ 是惰性的,这意味着我们只定义将来要执行的表达式树。考虑一下 PHP 中的 lambda 函数,除非我们显式调用它,否则它不会执行。上面的代码直到最后一行才会执行 ToListAsync()