2015-08-07 3 views
0

У меня есть некоторый код, который дублирует во многих методах:Создать Unversal метод рамки сущности

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

вы можете уточнить, почему у вас й код несколько раз, и в чем разница между всеми различными версиями. – 3dd

+0

Это мой проект web-api для выбранной формы данных Db. И если я установил (NId, PId, BId), нужно выбрать данные для этих трех фильтров или, если некоторые параметры не установлены, необходимо выбрать только некоторые данные. –

+0

Я дублировал этот код, потому что я использую его разными методами. –

ответ

1

Я принял догадку на некоторые из ваших типов выше - если вы можете добавить интерфейс к чему-либо с НДИ, 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 
Смежные вопросы