Я делаю выбор для IQueryable, поэтому этот IQueryable может исходить из двух разных таблиц, но dto одинаков. Моя проблема в том, что я дублирую код из-за выбора для каждого из них. Есть ли способ создать общий метод, который получает IQueryable и внутри него делает выбор?
Вы берете этот код, помещаете его в метод, создаете интерфейс, который определяет все эти реквизиты для сущности Таблица, заставляете каждую другую сущность реализовывать этот интерфейс, а затем ваш метод может принимать объект типа IWhatever.
Как насчет использования метода расширения IQueryable
?
У вас есть интерфейс:
interface INamed{
string Name {get; set;}
}
У вас есть два разных табличных объекта, которые реализуют его, потому что они оба имеют свойство Name:
public class Person : INamed {
public string Name { get; set; }
}
public class Company: INamed {
public string Name { get; set; }
}
У вас есть метод сопоставления, который берет все, что реализует INamed, и выбрасывает объект с установленным именем:
SomeDto Map(INamed x){
return new SomeDto { Name = x.Name }
}
И вы называете это соответствующим образом:
context.Persons.Select(person => Map(person) );
context.Companies.Select(company => Map(company) );
Примечание; объекты были упрощены для ясности демонстрации точки
Именно для этого используется интерфейс. Ваш выбор - это интерфейс в объект класса.