ASP.NET Core EF LINQ - 我可以分解大型查询语句并仍然让它执行一次吗

标签 asp.net entity-framework asp.net-core entity-framework-core

我的印象是,如果我编写以下代码:

filteredClients = _clientAPIRepository.AllIncluding(s => s.Jobs, s => s.Suburb);

它将执行将内容传递到filteredClients中的语句,然后我想使用where子句过滤多个列。

我最初的理解是,它将整个表转移到内存中,而不是在数据库服务器上完成所有工作。我对这里的效率感兴趣,并且希望在数据库上执行一次查询,而不必返回,因为我添加了一个 where 子句等。因此,我尝试创建一个大型一次性语句来尝试满足这一意图...

然后我遇到了this answer from Jon Skeet表示在您开始使用结果之前,EF 查询不会立即执行。

我不知道查询的形状会是什么样子。该人可以对一列或几列进行过滤,也可以对一列或多列进行排序。

如上所述,我尝试使用单个查询进行过滤,同时尝试考虑以下事实:不需要某些 where 子句。

        filteredClients = _clientAPIRepository.AllIncluding(s => s.Jobs, s => s.Suburb)
        .Where(c => c.ClientNo.ToString().StartsWith(clientFilters.ClientNo) || clientFilters.ClientNo == string.Empty)
        .Where(c => c.CompanyName.StartsWith(clientFilters.ClientLastName) || clientFilters.CompanyName == string.Empty)
        .Where(c => c.MobilePhone.StartsWith(clientFilters.MobilePhone) || clientFilters.MobilePhone == string.Empty);

..我还需要为此添加排序。

如果我从这个查询开始(带有谓词):

filteredClients = _clientAPIRepository.AllIncluding(s => s.Jobs, s => s.Suburb);

然后,稍后在该方法中,我向其中添加一个 where 子句,如下所示:

filteredClients.where.Where(c => c.ClientNo.ToString().StartsWith(clientFilters.ClientNo));

..等等构建查询 - 基于我可以在我的方法中选择的过滤器和 orderby。

我想知道我是否可以逐渐构建查询,仅根据从网页发送的内容添加 where 子句和 orderbys.. AND,当执行查询时.. AND,如果执行一次或多次?

最佳答案

是的,您可以逐步构建查询而不执行它们。我相信这叫做deferred execution 。基本上,针对数据源的 Linq 查询会创建 IQueryable<Type>您可以传递和修改的对象。这只是构建了一堆 SQL 命令,而不是获取实际结果。 然后您可以通过调用函数之一来执行它,例如 ToList , ToDictionary , FirstOrDefault , Average , Sum等枚举IQueryable (例如 foreach )也会导致它执行。因此,只要您查询的上下文未释放,您就可以添加任意数量的 whereorderby根据需要编写子句并在完成后执行。 链接中的示例:

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    IQueryable<Product> productsQuery =
        from p in context.Products
        select p;

    IQueryable<Product> largeProducts = productsQuery.Where(p => p.Size == "L");

    Console.WriteLine("Products of size 'L':");
    foreach (var product in largeProducts) // <-- Query is not executed until here
    {
        Console.WriteLine(product.Name);
    }
}

关于ASP.NET Core EF LINQ - 我可以分解大型查询语句并仍然让它执行一次吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57583393/

相关文章:

c# - 与 SSMS 相比,LINQ 查询非常慢

c# - .NET Core 2.0 MVC odd 404 on controller methods only when deployed to IIS

asp.net - Kentico 9 购物车 ECommerceContext 金额在宏和布局/.NET 之间不一致

c# - asp.net mvc 中的数据库上下文类的用途是什么

asp.net - 将网站添加到本地iis。出现服务器未找到错误

c# - 自定义数据提供者?

postgresql - 突然 "there was an error running the selected code generator package restore failed"脚手架时总是出现此错误

docker - Microsoft.DotNet.Docker.CommandLineClientException:客户端版本1.22太旧

ASP.NET MVC 4 - CMS/CMS 组件(如 Wordpress)

ASP.NET 网站产生了数百个到 SQL Server Express 实例的连接 - 如何识别罪魁祸首?