为实体框架创建通用方法

时间:2015-08-07 10:32:05

标签: c# entity-framework

我有一些代码在许多方法中都有重复:

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>,但它没有给我结果。

1 个答案:

答案 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