Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ-可查询优化-是否需要它?_C#_Linq_Optimization_Iqueryable - Fatal编程技术网

C# LINQ-可查询优化-是否需要它?

C# LINQ-可查询优化-是否需要它?,c#,linq,optimization,iqueryable,C#,Linq,Optimization,Iqueryable,假设我们有一个带有几个复选框的表单(比如说类似的报告——基于相同的表,但不同的过滤器) 我有一个方法,它只需要几个参数——其中3个参数对于每个报告都是通用的,其中3个参数对于一个报告是特定的。简化版: public IEnumerable<ReportSet> GetAList(DateTime commonDate, bool commonBoolean, TypeEnum mainReportType, AnotherTypeEnum sideType) { IQueryab

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

我有一个方法,它只需要几个参数——其中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;
}
public IEnumerable GetList(DateTime commonDate,bool commonBoolean,TypeEnum Main ReportType,另一个TypeEnum sideType)
{
IQueryable aList=this.DB.Reports;
aList=aList.FilterByDate(commonDate);
aList=aList.FilterByBool(公共布尔);
开关(主报告类型)
{
案例1:
aList=aList.Where(x=>x…)
打破
案例2:
aList=aList.Where(x=>x…)
打破
}
回归主义者;
}
如果选中所有复选框,我必须多次将firts作为方法的一部分(因此从db和2 filterBy中获取),但我必须使用一些元组,因为我需要为每个报表特定的参数设置一组参数,并且我猜每个元组调用带有开关部分的私有方法

我可以做到,但它值得吗,因为这些过滤器在iqueryable上只有一部分?(在任何情况下,从DB获取数据都要进行几次)

有什么建议吗

编辑:根据下面的答案,这是我的计划:
我将使用所有过滤器,构建一个查询,获取所有想要的数据以填充所有选中的列表(但不超过),而不是转到数据库(仅一次,因为我想在这里转到数据库是最昂贵的,所以我只想这样做一次),然后将结果拆分到c#中所需的列表中。

我想我理解您的问题,但是LINQ2SQL(或任何LINQ)将仅在需要时进行计算,而不是直接在语句/赋值上进行计算

它叫

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

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


这是个好主意-谢谢,我刚刚学到了一些新的很棒的东西:)我将拆分并执行一个查询,然后执行-do.where in c#将其拆分到我想要的列表中。
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