在Linq中从复杂视图中选择需要很长时间

z3yyvxxp  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(97)

我试图从一个复杂的视图中选择数据,但查询物化需要很长时间(4秒)。
这是代码:

// 1. Perform a Search by name on tbl_member
            var memberIDs = (from m in DC.tbl_Member
                             where (m.FirstNameFiltered + ' ' + m.LastNameFiltered).Contains(fileteredName)
                             select m.MemberID).Take(10).ToList();

            // 2. Get the members data from View_QuickSearch
            var members = (from m in DC.View_QuickSearch
                           where memberIDs.Contains(m.MemberID)
                           select m);

            // 3. Materialize the results
            members.ToList();

字符串
第一个语句在tbl_Member中进行实际搜索并返回所需的ID。它的时间是预期的,它在2秒钟内顺利运行。
第二条语句根据返回的10个ID从Complex View中检索数据。调用members.ToList()时,需要很长时间(4秒)。
我从Visual Studio调试器中获得了
members
查询,并将其放入SSMS中,它在几毫秒内立即返回数据。

SELECT [t0].[MemberID], [t0].[fullName], [t0].[fullNameFiltered], [t0].[Mobile], [t0].[NationalID], [t0].[Job], [t0].[Company], [t0].[EDUClass], [t0].[AttendanceChurch], [t0].[FamilyChurch]
FROM [dbo].[View_QuickSearch] AS [t0]
WHERE [t0].[MemberID] IN (756, 969, 1349, 1390, 1486, 1900, 2234, 2697, 2852, 3286)


所以这意味着问题不在视图本身,也不在select语句或索引中。

u3r8eeie

u3r8eeie1#

为了加快提供的代码,可以做一些优化:

1.减少数据库往返:您可以使用联接将逻辑组合到单个查询中,而不是执行单独的查询来获取成员ID和成员数据。
1.提前限制查询大小:您可以直接在查询中限制结果的数量,而不是先获取所有匹配成员,然后具体化结果。

下面是代码的优化版本:

var members = (from m in DC.View_QuickSearch
                       join member in DC.tbl_Member
                       on m.MemberID equals member.MemberID
                       where (member.FirstNameFiltered + " " + member.LastNameFiltered).Contains(filteredName)
                       select m).Take(10).ToList();

字符串
在这个优化的代码中:

  1. tbl_Member表基于MemberID列与View_QuickSearch视图联接。这样就不需要单独的查询来获取成员ID。
    1.搜索条件直接应用在查询的where子句中,将名称筛选与联接条件结合起来。
  2. Take(10)方法将查询结果限制为最多10条记录,从而减少了不必要的数据检索。
  3. ToList()方法可以立即具体化结果,从而消除了对额外查询的需要。
    通过组合查询并在流程的早期应用过滤和限制,这个优化版本应该有助于提高代码的速度和效率。

相关问题