微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

要求:为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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。