如何使用Unions更有效地进行LINQ查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Unions更有效地进行LINQ查询相关的知识,希望对你有一定的参考价值。

我继承了下面的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));
答案

代码似乎使用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));
另一答案

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

以上是关于如何使用Unions更有效地进行LINQ查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 EF 和 LINQ 更有效地实现相关项目

如何使用 LESS 更有效地使用媒体查询?

如何将 sql union 转换为 linq

如何使用 Spring 的 JDBCTemplate 有效地执行 IN() SQL 查询?

将数组存储为逗号分隔,如何使用 LINQ 进行查询?

让我们一起写出更有效的CSharp代码吧,少年们!