LINQ -可查询的优化-是需要的吗?

本文关键字:优化 查询 LINQ | 更新日期: 2023-09-27 18:09:56

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

我有一个方法,它需要几个参数-其中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;
}

如果所有复选框将被选中,我必须使方法的第一部分几次(所以从db和2 filterBy获得),但我必须使用一些元组,因为我需要一组参数为每个报告特定的参数和foreach元组调用私有方法与开关部分我猜。

我可以这样做,但是否值得这样做,因为这些过滤器只有一部分是可查询的?(在任何情况下,从DB获取数据将被执行几次)。

任何建议吗?

编辑:根据下面的答案,这就是我的计划:我会采取所有的过滤器,建立一个查询得到所有想要的数据来填充所有的检查列表(但没有更多),而不是去DB(只有一次去DB是最昂贵的在这里我猜所以我想这样做只有一次),而不是分割结果到列表我需要在c#。

LINQ -可查询的优化-是需要的吗?

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

这叫做延迟执行!

所以在你的例子中,你只是构建一个(巨大的)查询,并使用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