我有一些代码在许多方法中都有重复:
IQueryable<СollectorTable> сollectors = ctx.СollectorTable.Where(x => x.Date >= (DateTime)d.StartDate && x.Date <= (DateTime)d.EndDate);
if (d.NId.Count != 0)
сollectors = сollectors.Where(x => d.NId.Contains(x.NId));
if (d.PId.Count != 0)
сollectors = сollectors.Where(x => d.PId.Contains(x.PId ?? -1));
if (d.BId.Count != 0)
сollectors = сollectors.Where(x => d.BId.Contains(x.BId ?? -1));
.....
some code with сollectors work
我想创建一些通用方法,但我不知道。
我尝试使用<T>
,但它没有给我结果。
答案 0 :(得分:1)
我已经对上面的某些类型进行了猜测 - 如果您能够使用NId,PId,BId属性添加任何界面,那么您可以创建界面:
public interface ICollectorTable
{
int? NId { get; }
int? PId { get; }
int? BId { get; }
}
和扩展方法:
public static class ExtensionMethods
{
public static IQueryable<T> FilterCollectors<T>(this IQueryable<T> collectors, SomeObject d)
where T : ICollectorTable
{
if (d.NId.Count() != 0)
collectors = collectors.Where(x => d.NId.Contains(x.NId));
if (d.PId.Count() != 0)
collectors = collectors.Where(x => d.PId.Contains(x.PId ?? -1));
if (d.BId.Count() != 0)
collectors = collectors.Where(x => d.BId.Contains(x.BId ?? -1));
return collectors;
}
}
然后你问题中的代码将成为:
IQueryable<СollectorTable> сollectors = ctx.СollectorTable.Where(x => x.Date >= (DateTime)d.StartDate && x.Date <= (DateTime)d.EndDate);
collectors = collectors.FilterCollectors(d);
.....
some code with сollectors work