【问题标题】:How to handle null in Linq Expression如何在 Linq 表达式中处理 null
【发布时间】:2021-01-21 04:19:12
【问题描述】:

网络核心应用程序。我实现了通用存储库模式。我正在做一些过滤功能,如下所示。

 var param = Expression.Parameter(typeof(SiteAssessmentRequest), "x");
 Expression<Func<SiteAssessmentRequest, bool>> query;
 if(request.role == "Admin")
 {
 query = null;
 }
 else
 {
   query = x => x.CreatedBy == request.Userid || x.AssignedTo == request.Userid;
 }
 Expression body = Expression.Invoke(query, param);
 if (request.Client != null && request.Client.Length != 0)
            {
                Expression<Func<SiteAssessmentRequest, bool>> internalQuery = x => request.Client.Contains(x.Client);
                body = Expression.AndAlso(Expression.Invoke(query, param), Expression.Invoke(internalQuery, param));
            }
  if (request.CountryId != null && request.CountryId.Length != 0)
            {
                Expression<Func<SiteAssessmentRequest, bool>> internalQuery = x => request.CountryId.Contains(x.CountryId);
                body = Expression.AndAlso(Expression.Invoke(query, param), Expression.Invoke(internalQuery, param));
            }
var lambda = Expression.Lambda<Func<SiteAssessmentRequest, bool>>(body, param);
 var siteAssessmentRequest = await _siteAssessmentRequestRepository.GetAsync(lambda, x => x.OrderByDescending(x => x.Status == Status.New.ToString()).ThenByDescending(x => x.Status == GetEnumDescription(Status.InProgress)).ThenByDescending(x => x.Status == Status.Closed.ToString()).ThenByDescending(x => x.StartDate), x => x.Country).ConfigureAwait(false);

在上面的代码中,只要管理员登录我不想过滤。在管理员的情况下,当我将 null 分配给以下异常时,它会在下面的行中抛出

Expression body = Expression.Invoke(query, param); 

参数:表达式为必填项,不能为空

谁能帮我解决这个问题。任何帮助,将不胜感激。谢谢

【问题讨论】:

    标签: c# linq generics lambda repository-pattern


    【解决方案1】:

    我认为你的问题出在

    if(request.role == "Admin"){ query = null; }
    else{
       query = x => x.CreatedBy == request.Userid || x.AssignedTo == request.Userid;
    } 
    

    本节。当请求来自管理员时,您不想过滤查询。所以,我觉得你可以试试这个

    if(request.role == "Admin")
    { 
       query = x => x.CreatedBy > 0;
    }
    
    //If CreatedBy is String Type
    if(request.role == "Admin")
    { 
       query = x => !string.IsNullOrEmpty(x.CreatedBy) && !string.IsNullOrWhiteSpace(x.CreatedBy);
    }
    

    因为,CreatedBy 应该可用于每个项目。
    注意:请尝试一下,让我知道它是否有效。

    【讨论】:

    • 嗨,它对我有用,但 createdby 是字符串,所以我无法给出 > 0 所以我所做的是我给出了 query = x => x.SiteAssessmentRequestId > 0;
    • 我已经为你编辑了我的答案。如果你想使用 CreatedBy 属性,你可以试试!string.IsNullOrEmpty(x.CreatedBy) &amp;&amp; !string.IsNullOrWhiteSpace(x.CreatedBy)。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多