如何解决在.Net中使用动态查询使用EF核心性能问题
要求:为ID和名与记录匹配的成员从表中选择记录列表。 请求中的成员数量可能会根据请求而有所不同: 我编写了以下代码以使用表达式生成动态查询。
is.ymd_hms("2020/01/01 22:22:22")
#> TRUE
is.ymd_hms2("2020/01/01 22:22:22")
#> FALSE
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 举报,一经查实,本站将立刻删除。