如何使用联合使 LINQ 查询更高效

How to make LINQ query with Unions more efficient

继承了下面的LINQ查询,感觉可以重构查询提高效率。该查询目前需要大约 6-8 秒的处理时间才能 return 向应用程序前端的用户发送一条记录。 LINQ 不是我的强项,所以任何帮助将不胜感激。

查询最终应生成一个不同的 CA_TASK_VW 对象列表,这些对象与从 CA_OBJECT、CA_PEOPLE 获得的不同 CA_OBJECT_ID 的列表相关联和 CA_CONTRACTOR 个表格。

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));

如果您不太关心查询结果中的重复项,您可以尝试使用 UNION ALL,因为它比 UNION

快得多

代码好像是用Join/Union来执行基本的[=13=列表上的一个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));