【问题标题】:Looking to combine two methods with c#希望将两种方法与 c# 结合起来
【发布时间】:2020-10-27 14:56:56
【问题描述】:

大家好,我有以下两种方法,并希望将两者结合起来,一种方法不需要任何连接,而另一种方法需要那些我如何结合这两种方法

    internal static IQueryable<ConstructionSet> CalculateSelectedConstructionSetsForOSM(Guid? ashraeClimateZoneId,
                                                                                        Guid? energyCodeId,
                                                                                        Guid? massingTypeId,
                                                                                        APIDbContext dbContext)
    {
        if (dbContext is null)
        {
            throw new ArgumentNullException(nameof(dbContext));
        }

        return dbContext.ConstructionSets.Include(p => p.AshraeClimateZone)
                                         .Include(p => p.MassingType)
                                         .Include(p => p.SourceOfData)
                                         .Include(p => p.ExteriorWall)
                                         .Include(p => p.ExteriorFloor)
                                         .Include(p => p.InteriorFloor)
                                         .Include(p => p.InteriorWall)
                                         .Include(p => p.SlabOnGrade)
                                         .Include(p => p.BelowGradeWall)
                                         .Include(p => p.Glazing)
                                         .Include(p => p.Roof)
                                         .Where(p => p.AshraeClimateZoneId == ashraeClimateZoneId
                                         && p.SourceOfDataId == energyCodeId
                                         && p.MassingTypeId == massingTypeId
                                         && p.Revision != null
                                         && p.IsApproved == true)
                                         .AsEnumerable()
                                         .OrderByDescending(i => i.Revision)
                                         .GroupBy(i => i.InitialRevisionId)
                                         .Select(g => g.First()).AsQueryable();
    }

下面是另一种方法

    internal static IQueryable<ConstructionSet> CalculateSelectedConstructionSetsForProject(Guid? ashraeClimateZoneId,
                                                                                            Guid? energyCodeId,
                                                                                            Guid? massingTypeId,
                                                                                            APIDbContext dbContext)
    {
        if (dbContext is null)
        {
            throw new ArgumentNullException(nameof(dbContext));
        }

        return dbContext.ConstructionSets.Include(p => p.AshraeClimateZone)
                                         .Include(p => p.MassingType)
                                         .Include(p => p.SourceOfData)
                                         .Where(p => p.AshraeClimateZoneId == ashraeClimateZoneId
                                         && p.SourceOfDataId == energyCodeId
                                         && p.MassingTypeId == massingTypeId
                                         && p.Revision != null
                                         && p.IsApproved == true)
                                         .AsEnumerable()
                                         .OrderByDescending(i => i.Revision)
                                         .GroupBy(i => i.InitialRevisionId)
                                         .Select(g => g.First()).AsQueryable();
    }

谁能告诉我如何结合这些方法,非常感谢。

【问题讨论】:

  • “组合它们”是什么意思。您只是想将这些值连接在一起吗?你试过'concat'吗?

标签: c# .net linq generics refactoring


【解决方案1】:

假设“组合它们”您的意思是“重构它们以便一个方法可以处理这两种情况”,您可以执行以下操作:

internal static IQueryable<ConstructionSet> CalculateSelectedConstructionSets(Guid? ashraeClimateZoneId,
                                                                                    Guid? energyCodeId,
                                                                                    Guid? massingTypeId,
                                                                                    APIDbContext dbContext,
                                                                                    bool includeOsmNavigationProperties)
{
    if (dbContext is null)
    {
        throw new ArgumentNullException(nameof(dbContext));
    }

    var sets = dbContext.ConstructionSets.Include(p => p.AshraeClimateZone)
                                     .Include(p => p.MassingType)
                                     .Include(p => p.SourceOfData);
    if(includeOsmNavigationProperties)
    {
        sets = sets.Include(p => p.ExteriorWall)
                                     .Include(p => p.ExteriorFloor)
                                     .Include(p => p.InteriorFloor)
                                     .Include(p => p.InteriorWall)
                                     .Include(p => p.SlabOnGrade)
                                     .Include(p => p.BelowGradeWall)
                                     .Include(p => p.Glazing)
                                     .Include(p => p.Roof);
    }
    return sets.Where(p => p.AshraeClimateZoneId == ashraeClimateZoneId
                                     && p.SourceOfDataId == energyCodeId
                                     && p.MassingTypeId == massingTypeId
                                     && p.Revision != null
                                     && p.IsApproved == true)
                                     .AsEnumerable()
                                     .OrderByDescending(i => i.Revision)
                                     .GroupBy(i => i.InitialRevisionId)
                                     .Select(g => g.First()).AsQueryable();
}

附带说明,您应该避免将其转换为.AsEnumerable(),然后再转换回.AsQueryable() 的模式。将结果设为IQueryable 会使对返回集合的后续操作变得更慢(表达式需要在运行时编译),并且它隐藏了您不会在数据库层执行后续操作的事实。有人可能会添加一个Where() 子句,却没有意识到它们仍然会导致整个数据集从数据库中加载出来。

【讨论】:

  • 非常感谢您的回复,我删除了该转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2020-10-09
  • 2011-12-10
相关资源
最近更新 更多