我如何合并以下方法?我应该这样做吗?
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));
}
答案 0 :(得分:3)
答案 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));
}
看一下这个例子:
正如您所看到的,每次调用方法Where()时,您都会进行大量的额外工作。