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#。我想我理解你的问题,但是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