c# - LINQ - IQueryable 优化 - 是否需要?

标签 c# linq optimization iqueryable

假设我们有一个带有几个复选框的表单(假设类似的报告 - 基于相同的表,但过滤器不同)。

我有一个方法,它需要很少的参数 - 其中 3 个参数对于每个报告都是通用的,其中 3 个参数是特定于报告的。简化版:

public IEnumerable<ReportSet> GetAList(DateTime commonDate, bool commonBoolean, TypeEnum mainReportType, AnotherTypeEnum sideType)
{
  IQueryable<ReportSet> aList = this.DB.Reports;

  aList = aList.FilterByDate(commonDate);
  aList = aList.FilterByBool(commonBoolean);

  switch(mainReportType)
  {
    case 1:
       aList = aList.Where(x=>x..)
       break;
    case 2:  
       aList = aList.Where(x=>x..)
       break;
  }

 return aList;
}

如果所有复选框都被选中,我必须多次使方法的一部分(因此从数据库和2个filterBy获取),但我必须使用一些元组,因为我需要为每个报告特定的一组参数我猜参数和 foreach 元组调用带有 switch 部分的私有(private)方法。

我可以做到,但是值得做吗,因为这些过滤器仅位于 iqueryable 的一部分上? (无论如何,从数据库获取数据都会进行几次)。

有什么建议吗?

编辑:根据下面的答案,这是我的计划: 我将采用所有过滤器,构建一个查询,获取所有想要的数据来填充所有检查列表(但不再),然后转到数据库(仅一次,因为我猜这里的成本最高,所以我想做仅一次),然后将结果拆分到我在 C# 中需要的列表。

最佳答案

我想我理解你的问题,但 LINQ2SQL(或任何与此相关的 LINQ)只会在需要时进行评估,而不是直接对语句/赋值进行评估。

它的名字是 deferred execution !

因此,在您的示例中,您只是构建一个(巨大的)查询,并使用 ToList() 或 foreach,它将评估您堆叠在一起的所有内容,生成一个大的 SQL 语句并将其传递到数据库评价。

当您启用对生成的 SQL 语句的日志记录时,您可以检查此行为:

https://msdn.microsoft.com/en-us/library/bb386961(v=vs.110).aspx

db.Log = Console.Out;
IQueryable<Customer> custQuery =
    from cust in db.Customers
    where cust.City == "London" 
    select cust;

foreach(Customer custObj in custQuery)
{
    Console.WriteLine(custObj.CustomerID);
}

生成:

SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactT
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Coun
try], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[City] = @p0
-- @p0: Input String (Size = 6; Prec = 0; Scale = 0) [London]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20810.0

关于c# - LINQ - IQueryable 优化 - 是否需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32222104/

相关文章:

c# - 迭代 LINQ 实体结果

c# - 如何使用 Entity Framework 4 在桌面服务器端应用程序中正确实现每个范围和存储库的工作单元?

c# - 更改 ResourceManager(使其可更新)

c - ARMCC 删除未使用的变量

MySQL - 如何优化我的查询

c# - 如何在 wp7 中通过扬声器播放广播

Linq 将 IEnumerable(Of Struct) 连接到 IEnumerable(of object)

c# - 如何查找具有与另一个集合中的任何值匹配的属性的所有对象?

c# - Linq 从另一个列表中获取列表

python - 如何优化 Python 中二维字符串数组的序数编码?