IQueryable中带有代码块的方法调用

时间:2018-08-14 18:01:16

标签: c# linq iqueryable

我正在将IQueryable返回到控制器,该控制器将调用Kendo的 toDataSource()方法,该方法负责我的过滤器,排序,分组等:

public IQueryable<NcEntityDto> GetEntityIQueryableForKendoGrid()
{
    var userId = AbpSession.UserId;
    var query = (from e in _ncEntityRepository.GetAll()
        .Include(m => m.CarePlans)
        .Include(m => m.Warnings)
                    join o1 in _organizationUnitRepository.GetAll() on e.OrganizationUnitId equals o1.Id
                    join u1 in _userOrganizationUnitRepository.GetAll().Where(m => m.UserId == userId) on o1.Id equals u1.OrganizationUnitId

                    select new NcEntityDto()
                    {
                        Id = e.Id,
                        DisplayName = e.DisplayName,
                        CreationTime = e.CreationTime,
                        ExtensionData = e.ExtensionData,
                        OrganizationUnitDisplayName = o1.DisplayName,
                        CarePlanSectionsForReviewCount = e.CarePlans.Where(cp => cp.ReviewDatetime.HasValue && cp.ReviewDatetime < Clock.Now).Count(),
                        CarePlanSectionsReviewedCount = e.CarePlans.Where(cp => cp.ReviewDatetime.HasValue && cp.ReviewDatetime >= Clock.Now).Count(),
                        WarningCount = e.Warnings.Count()
                    })
        .AsQueryable();
    return query;
}

我想用一种方法来构建OrganisationDisplayName,该方法可以读取上行树并为我创建一个面包屑:

public string GetOrganisationUnitBreadcrumbSync(long input)
{
    var breadcrumbList = new List<string>(); ;
    var ncOrganizationUnit = _organizationUnitRepository.FirstOrDefault(input);

    while (ncOrganizationUnit != null)
    {
        breadcrumbList.Add(ncOrganizationUnit.DisplayName);
        ncOrganizationUnit = _organizationUnitRepository.FirstOrDefault(Convert.ToInt64(ncOrganizationUnit.ParentId));
    }
    breadcrumbList.Reverse();
    return string.Join(" - ", breadcrumbList);
}

将方法添加到IQueryable:

OrganizationUnitDisplayName = GetOrganisationUnitBreadcrumbSync(o1.Id) 

我从实体框架收到运行时错误-

  

在这种情况下开始第二次操作

我试图通过使用invoke来以异步方式调用方法调用,但是我找不到在表达式函数中使用代码块来扩展可查询对象的方法。面包屑简化了网格的“ 分组依据”功能,因此在 toDataSource()调用之后,我无法迭代数据集。有什么想法可以使IQueryable中的代码块实现方法调用而又不引起基础上下文的第二次调用问题吗?

0 个答案:

没有答案