【问题标题】:Filter Stored Procedure Results using Linq使用 Linq 过滤存储过程结果
【发布时间】:2017-12-07 18:55:04
【问题描述】:

我有这段代码使用带有 EF 的 SP 从服务器获取日期

  List<sp_PlacementSearchResult_Result> listResults = new List<sp_PlacementSearchResult_Result>();
  var query = Context.sp_PlacementSearchResult(request.HasamaFormId, request.DepartmentId, request.InstitutionNum, request.IsSigned).AsQueryable();  

这是有效的,现在我想在结果中添加一些过滤器,如下所示:

 if (role.PermissionId.Equals((int)Permission.Institution))
        {
            query = query.Where(form => PropRole.InstitutionNum.Contains((int)form.OrganizationOrInstitutionNum));
        }

当我尝试做时在函数的末尾

 listResults = query.ToList();

我收到错误消息,“可为空的对象必须有一个值。”
ToList() 只有在进入 if 语句时才会失败。

附注: 起初我用没有 SP 的 EF 完成了这个查询:

  var query = Context.APP_AuthorityHasamaForm.AsQueryable();

这样,即使 ToList() 进入 if 语句,我也没有问题

感谢

编辑:这是所有功能:

  IEnumerable<sp_PlacementSearchResult_Result> IAuthorityHasamaFormRepository.GetByRequestFromSP(PlacementRequest request, APP_Role role, PropertiesRole PropRole)
    {
        List<sp_PlacementSearchResult_Result> listResults = new List<sp_PlacementSearchResult_Result>();

        request.HasamaFormId = (request.HasamaFormId > 0) ? request.HasamaFormId : null;
        request.InstitutionNum = (request.InstitutionNum > 0) ? request.InstitutionNum : null;

        if (request.StartDate.HasValue)
        {
            request.StartDate = new DateTime(request.StartDate.Value.Year, request.StartDate.Value.Month, request.StartDate.Value.Day, 00, 00, 00);

        }

        if (request.EndDate.HasValue)
        {
            request.EndDate = new DateTime(request.EndDate.Value.Year, request.EndDate.Value.Month, request.EndDate.Value.Day, 00, 00, 00);

        }

        var query = Context.sp_PlacementSearchResult(request.HasamaFormId, request.DepartmentId, request.InstitutionNum, request.IsSigned, request.IdentityIdSign,
            request.StartDate, request.EndDate, request.AuthorityNum, request.CertificateNum, null).AsQueryable();

        if (role.PermissionId.Equals((int)Permission.Department))
        {
            query = query.Where(form => PropRole.DepartmentId.Contains(form.DepartmentId));
        }

        if (role.PermissionId.Equals((int)Permission.Institution))
        {
            query = query.Where(form => PropRole.InstitutionNum.Contains((int)form.OrganizationOrInstitutionNum));
        }

        try
        {
            listResults = query.ToList();
            return listResults;
        }
        catch (Exception e)
        {

            throw;
        }

         listResults = query.ToList();

        return listResults;
    }

【问题讨论】:

  • 什么意思是“在函数的末尾”。您能否向我们展示您在 `if` 块或整个函数周围的代码。
  • 我添加了所有功能

标签: c# sql-server entity-framework linq


【解决方案1】:

您应该考虑form.OrganizationOrInstitutionNum 可能的空值

 if (role.PermissionId.Equals((int)Permission.Institution))
        {
            query = query.Where(form => form.OrganizationOrInstitutionNum != null && PropRole.InstitutionNum.Contains(form.OrganizationOrInstitutionNum.Value));
        }

【讨论】:

    【解决方案2】:

    您没有在您的模式中指定哪个是可为空的类型。然后有一些可能性。示例如下:

     query = query.Where(form => PropRole.InstitutionNum.Contains((int)form.OrganizationOrInstitutionNum));
    

    如果 form.OrganizationOrInstitutionNum 为 null,则转换为 int 将失败。试试这个:

    query = query.Where(form => form.OrganizationOrInstitutionNum.HasValue && PropRole.InstitutionNum.Contains((int)form.OrganizationOrInstitutionNum.Value));
    

    也许你可以保存投射它。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2019-07-31
      相关资源
      最近更新 更多