我正在尝试找出如何优化某些数据库查询的方法,以使它们使用我们数据库中内置的索引,并快速提取需要的数据。
我想理解的是,在下面的代码中什么时候将IQueryable转换为SQL,并发送到数据库以进行检索。我在下面的尝试是尝试利用现有索引来缩小数据集的范围,然后对较小的数据集执行其他更复杂,索引更少的操作。
我的直觉是,直到我调用ToListAsync(),该调用才真正进入数据库(因此使我的方法变得毫无意义),但是我不确定。
对于上下文,以下代码是控制器操作,并包装在某些异常处理中。为了简单起见,将所有内容都删除了。
var shift_Offers = db.Shift_Offers.Include(c => c.Callout)
.Where(x => x.Callout.shift_date_new >= today
&& x.employee_id_fk == id
&& x.offer_timestamp != null);
//do the complex work on the data set once we've gotten the main dataset
shift_Offers = shift_Offers.Where(x => ((x.Callout.employee_id_fk ?? -1) == id ||
(x.Callout.employee_id_fk ?? -1) == -1)
&& (x.Callout.status.Contains(CalloutStatus.inprogress)
|| x.Callout.status.Contains(CalloutStatus.inprogressWaitingNext)
|| x.Callout.status.Contains(CalloutStatus.stopped)
|| x.Callout.status.Contains(CalloutStatus.finishedSucceeded)
|| x.Callout.status.Contains(CalloutStatus.finishedFailed)));
//do work on the shift offer table last, once the data set is smallest
shift_Offers = shift_Offers.Where(x => !x.offer_status.Contains(ShiftOfferStatus.NotYetOffered));
Debug.WriteLine(shift_Offers.AsQueryable().ToString());
List<Shift_Offer> shos = await shift_Offers.ToListAsync();
return View(shos);
答案 0 :(得分:2)
在以下情况下对数据库执行查询:
在您的情况下是调用ToListAsync()方法时。通常,只要使用IQueryable对象,就不会执行查询,一旦尝试将其强制转换到其他对象上,就会进行查询。