将两种方法合并为一种

时间:2015-06-24 10:09:08

标签: c# oop

我如何合并以下方法?我应该这样做吗?

public IQueryable<ItemDTO> RepGetMonthItems(string inOut, string planFact, int month)
{
    return GetItemsWithCategory().
            Where(i => i.InOut.Equals(inOut)).
            Where(i => i.PlanFact.Equals(planFact)).
            Where(i => i.DateTime.Month.Equals(month));
}

public IQueryable<ItemDTO> RepGetYearItems(string inOut, string planFact, int year)
{
    return GetItemsWithCategory().
            Where(i => i.InOut.Equals(inOut)).
            Where(i => i.PlanFact.Equals(planFact)).
            Where(i => i.DateTime.Year.Equals(year));
}

5 个答案:

答案 0 :(得分:3)

不,你不应该。我看到的三个答案都打破了#34;做一件事&#34; Robert&#34; Bob叔叔&#34;马丁。阅读它here

答案 1 :(得分:2)

我同意“做一件事”&#39;原理。但我也相信DRY。

所以..救援的延伸方法!

让主要功能做一件事(获取报告项目)和扩展方法按年或月过滤。

声明一个像这样的扩展方法类:

    public static class QueryExtensions
    {
        public static IQueryable<ItemDTO> ForYear(this IQueryable<ItemDTO> query, int year)
        {
            return query.Where(i => i.DateTime.Year.Equals(year));
        }

        public static IQueryable<ItemDTO> ForMonth(this IQueryable<ItemDTO> query, int month)
        {
            return query.Where(i => i.DateTime.Month.Equals(month));
        }
    }

创建一个像这样的简化RepGetItems方法:

    public IQueryable<ItemDTO> RepGetItems(string inOut, string planFact)
    {
        return GetItemsWithCategory().
            Where(i => i.InOut.Equals(inOut)).
            Where(i => i.PlanFact.Equals(planFact));
    }
然后用法如下:

 var yearResults = originalQuery.RepGetItems(input, fact).ForYear(2015);
 var monthResults = originalQuery.RepGetItems(input, fact).ForMonth(10);

甚至:

 var yearMonthResults = originalQuery.RepGetItems(input, fact).ForYear(2015).ForMonth(10);

完全灵活,不损失单一用途&#39;原理

答案 2 :(得分:1)

也许您可以使用Nullable<int>年份和月份:

public IQueryable<ItemDTO> RepGetItems(string inOut, string planFact, int? year, int? month)
{
    return GetItemsWithCategory().
        Where(i => i.InOut.Equals(inOut)).
        Where(i => i.PlanFact.Equals(planFact)).
        Where(i => !year.HasValue  || i.DateTime.Year.Equals(year.Value)).
        Where(i => !month.HasValue || i.DateTime.Month.Equals(month.Value));
}

答案 3 :(得分:0)

.Where条件可以轻松添加到查询中。

public IQueryable<ItemDTO> RepGetYearItems(string inOut, string planFact, int monthyear, bool useMonth)
{
    var query = GetItemsWithCategory().
        Where(i => i.InOut.Equals(inOut)).
        Where(i => i.PlanFact.Equals(planFact));

    if (useMonth)
    {
        query = query.Where(i => i.DateTime.Month.Equals(monthyear));
    }
    else
    {
        query = query.Where(i => i.DateTime.Year.Equals(monthyear));
    }

    return query;
}

或使用int?

public IQueryable<ItemDTO> RepGetYearItems(string inOut, string planFact, int? year, int? month)
{
    var query = GetItemsWithCategory().
        Where(i => i.InOut.Equals(inOut)).
        Where(i => i.PlanFact.Equals(planFact));

    if (year != null)
    {
        query = query.Where(i => i.DateTime.Year.Equals(year.Value));
    }

    if (month != null)
    {
        query = query.Where(i => i.DateTime.Month.Equals(month.Value));
    }

    return query;
}

请注意,这个版本与@TimSchmelter的版本不同......它不是固定的(它取决于SQL的“类型”)如果你在查询中有一些“死代码”会发生什么?查询不是“活动”,因为某些参数具有特定值,例如int他的查询)。他的查询显然包含一些“死代码”(整个i => !year.HasValue || i.DateTime.Year.Equals(year.Value))。如果可能的话我宁愿省略它。

答案 4 :(得分:0)

如何在这里使用可选参数:

public IQueryable<ItemDTO> RepGetMonthItems(string inOut, string planFact, int month, int year = -1)
    {
        return GetItemsWithCategory().Where(i => i.InOut.Equals(inOut) 
          && i.PlanFact.Equals(planFact)) && year == -1? 
            i.DateTime.Month.Equals(month) : i.DateTime.Year.Equals(year));
    }

看一下这个例子:

enter image description here

正如您所看到的,每次调用方法Where()时,您都会进行大量的额外工作。