В архитектурах, подобных CQRS , такое преобразование вообще не требуется, поскольку стороны приложения для чтения и записи разделены.
Но в Вашем случае Вы не можете сбежать от перевода.
Прежде всего - Вы должны быть более точными при определении репозиториев. Подпись репозитория - это то, что вы хотите оставить явным, а не родовым.
Типичный пример, демонстрирующий эту идею - можете ли вы сказать, какие индексы вам нужны в вашей базе данных, когда вы смотрите на свою подпись репозитория (возможно, рассматриваете реализацию репозитория, но, конечно, не обращаете внимания на код клиента)? Ты не можешь Потому что это слишком универсально, и клиентская часть может искать что угодно.
В вашем примере это немного лучше, потому что универсальность выражений связана с dto, а не entity.
Это то, что я делаю (используя NHibernate.Linq, но идея остается)
public class Application{
public Project Project {get;set;}
}
public class ApplicationRepository{
public IEnumerable<Application> Search(SearchCriteria inp){
var c=Session.Linq<Application>();
var q=c.AsQueryable();
if(!string.IsNullOrEmpty(inp.Acronym))
q=q.Where(a=>a.Project.Acronym.Contains(inp.Acronym));
/*~20 lines of similar code snipped*/
return q.AsQueryable();
}
}
//used by client
public class SearchCriteria{
public string Acronym{get;set;}
/*some more fields that defines how we can search Applications*/
}
Если вы хотите сохранить свои выражения, одним из способов было бы определить словарь вручную следующим образом:
var d=new Dictionary<Expression<Func<VideoDTO,object>>,
Expression<Func<VideoEntity,object>>{
{x=>x.DtoPropNumberOne,x=>x.EntityPropNumberOne} /*, {2}, {3}, etc.*/
};
И использовать его позже:
//can You spot it?
//client does not know explicitly what expressions dictionary contains
_dataModel.Videos.Where(d[exp]).ToList<Video>();
//and I'm not 100% sure checking expression equality would actually work
Если вы не хотите писать словарь сопоставления вручную, вам понадобятся некоторые продвинутые приемы. Одной из идей было бы перевести выражение dto в строку, а затем обратно в выражение объекта. Здесь - некоторые идеи (хотя и относящиеся к сортировке), которые могут помочь. Выражения довольно сложные звери.
В любом случае - как я уже сказал, вам следует избегать этого. В противном случае - вы получите действительно хрупкий код.