我继承了下面的LINQ查询,我认为可以重构该查询以提高效率。查询当前需要大约6-8秒的处理时间才能将一条记录返回给应用程序前端的用户。 LINQ并不是我的强项,所以任何帮助将不胜感激。
该查询最终应产生一个不同的CA_TASK_VW对象列表,这些对象与从CA_OBJECT,CA_PEOPLE和CA_CONTRACTOR表获得的不同CA_OBJECT_ID的列表相关。
var data = (from a in _db.CA_TASK_VW
where a.TASK_TYPE == "INSPECTION" && a.TASK_AVAILABLE_FLAG == "Y" && a.TARGET_END_DATE == null
select a).AsQueryable();
data = data.Join(_db.CA_OBJECT.Where(o => o.ENTERED_BY == _userId),
o => o.CA_OBJECT_ID, p => p.CA_OBJECT_ID,
(t, p) => t)
.Union(data.Join(_db.CA_PEOPLE.Where(p => p.EMAIL == _email),
t => t.CA_OBJECT_ID, p => p.CA_OBJECT_ID,
(t, p) => t))
.Union(data.Join(_db.CA_CONTRACTOR.Where(c => c.CONTRACTOR.EMAIL == _email),
t => t.CA_OBJECT_ID, c => c.CA_OBJECT_ID,
(t, c) => t));
答案 0 :(得分:1)
代码似乎正在使用Join
/ Union
来执行CA_TASK_VW
列表中的where谓词,并将其逐步筛选为最终结果,因此,如果您只使用直接指定where条件?
var data = from a in _db.CA_TASK_VW
where a.TASK_TYPE == "INSPECTION" && a.TASK_AVAILABLE_FLAG == "Y" && a.TARGET_END_DATE == null
select a;
data = data.Where(t => _db.CA_OBJECT.Where(o => o.ENTERED_BY == _userId).Select(o => o.CA_OBJECT_ID).Contains(t.CA_OBJECT_ID) ||
_db.CA_PEOPLE.Where(p => p.EMAIL == _email).Select(p => p.CA_OBJECT_ID).Contains(t.CA_OBJECT_ID) ||
_db.CA_CONTRACTOR.Where(c => c.CONTRACTOR.EMAIL == _email).Select(c => c.CA_OBJECT_ID).Contains(t.CA_OBJECT_ID));
答案 1 :(得分:0)
如果您真的不关心查询结果中的重复项,则可以尝试使用UNION ALL,因为它的运行速度比UNION快得多