简体   繁体   English

如何使带有Unions的LINQ查询更高效

[英]How to make LINQ query with Unions more efficient

I inherited the LINQ query below and I feel that the query can be refactored for efficiency. 我继承了下面的LINQ查询,我认为可以重构该查询以提高效率。 The query currently takes about 6-8 seconds of processing time to return one record to the user on the front-end of the application. 查询当前需要大约6-8秒的处理时间才能将一条记录返回给应用程序前端的用户。 LINQ is not my strong suite, so any help would be greatly appreciated. LINQ不是我的强项,因此任何帮助将不胜感激。

The query should ultimately produce a distinct list of CA_TASK_VW objects that are tied to a list of distinct CA_OBJECT_ID's obtained from the CA_OBJECT, CA_PEOPLE, and CA_CONTRACTOR tables. 该查询最终应产生一个不同的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));

The code seems to be using Join / Union to execute basically a where predicate on the list of CA_TASK_VW , filtering it step by step to the final result, so what happens if you just specify the where condition directly? 该代码似乎在使用Join / UnionCA_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));

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM