在.Net中使用动态查询使用EF核心性能问题

时间:2020-10-23 23:22:49

标签: linq entity-framework-core query-performance

要求:为ID和名与记录匹配的成员从表中选择记录列表。 请求中的成员数量可能会根据请求而有所不同: 我编写了以下代码以使用表达式生成动态查询。

is.ymd_hms("2020/01/01 22:22:22")
#> TRUE
is.ymd_hms2("2020/01/01 22:22:22")
#> FALSE

这会以以下格式生成SQL查询,这会花费很多时间

   private Expression<Func<TmpOncMemberAuth, bool>> CreateQueryExpression(List<MemberRequest> memberRequests)
        {
            var type = typeof(TmpOncMemberAuth);
            // member =>
            var memberParam = Expression.Parameter(type, "member");
            var requests = memberRequests;

            Expression selectLeft = null;
            Expression filterExpression = null;
            foreach (var member in requests)
            {

                var comparison = BuildSubQuery(member, memberParam, type);

                if (selectLeft == null)
                {
                    selectLeft = comparison;
                    filterExpression = selectLeft;
                    continue;
                }

                filterExpression =
                    Expression.Or(filterExpression, comparison);

            }
            return Expression.Lambda<Func<TmpOncMemberAuth, bool>>
                (filterExpression, memberParam);

        }

        
        private Expression BuildSubQuery(MemberRequest member, ParameterExpression memberParam, Type type)
        {
            // LHS
            // member.MemberID
            Expression leftMemberID = Expression.Property(memberParam, type.GetProperty("MemberId"));
            Expression leftMemberFirstName = Expression.Property(memberParam, type.GetProperty("MemberFirstName"));
           
           
            // RHS
            Expression requestMemberID = Expression.Constant(member.MemberID);
            Expression requestFirstName = Expression.Constant(member.FirstName);
           
            // member.MemberID == requestMemberID
            Expression compareID =
                Expression.Equal(leftMemberID, requestMemberID);

            Expression compareFName =
                Expression.Equal(leftMemberFirstName, requestFirstName);          

            // condition for a member
            Expression comparison = Expression.AndAlso(compareID, compareFName);
           
            return comparison;
        }

// query call in the main
  var whereQuery = CreateQueryExpression(memberData);

  var memberAuthData = await FindAllAsyncFromTemp(whereQuery);

我需要创建如下所示的SQL查询,该查询的执行速度比上面的查询快

SELECT [#].[CaseID] AS [CaseId], [#].[MemberID] AS [MemberId], [#].[MemberFirstName], [#].[MemberLastName], [#].[MemberDOB] 
FROM [#ONCMemberAuth] AS [#]
WHERE ((CASE
    WHEN (([#].[MemberID] = '12345') AND ([#].[MemberFirstName] = 'James') ) THEN CAST(1 AS bit)
    ELSE CAST(0 AS bit)
END | CASE
    WHEN (([#].[MemberID] = '6789') AND ([#].[MemberFirstName] = 'WILLERS') ) THEN CAST(1 AS bit)
    ELSE CAST(0 AS bit)
END) 
    ) = CAST(1 AS bit)

0 个答案:

没有答案
相关问题