Я пытаюсь использовать AutoMapper и шаблон хранилища вместе с плавным интерфейсом, и сталкиваюсь с трудностями с проекцией Linq. Что бы это ни стоило, этот код прекрасно работает при простом использовании объектов в памяти. Однако при использовании поставщика базы данных он ломается при построении графа запросов. Я пробовал и SubSonic и Linq to SQL с тем же результатом. Спасибо за ваши идеи.
Вот метод расширения, используемый во всех сценариях - это источник проблемы, поскольку все работает без использования методов расширения
public static IQueryable<MyUser> ByName(this IQueryable<MyUser> users, string firstName)
{
return from u in users
where u.FirstName == firstName
select u;
}
Вот код в памяти, который отлично работает
var userlist = new List<User> {new User{FirstName = "Test", LastName = "User"}};
Mapper.CreateMap<User, MyUser>();
var result = (from u in userlist
select Mapper.Map<User, MyUser>(u))
.AsQueryable()
.ByName("Test");
foreach (var x in result)
{
Console.WriteLine(x.FirstName);
}
Это то же самое, что при использовании SubSonic (или Linq to SQL или что-то еще), который не работает. Это то, что я хотел бы заставить работать как-то с помощью методов расширения ...
Mapper.CreateMap<User, MyUser>();
var result = from u in new DataClasses1DataContext().Users
select Mapper.Map<User, MyUser>(u);
var final = result.ByName("Test");
foreach(var x in final) // Fails here when the query graph built.
{
Console.WriteLine(x.FirstName);
}
Цель здесь состоит в том, чтобы избежать необходимости вручную сопоставлять сгенерированный объект «Пользователь» с объектом домена «MyUser» - другими словами, я пытаюсь найти способ использовать AutoMapper, чтобы у меня такого не было кода отображения везде, где требуется операция чтения базы данных:
var result = from u in new DataClasses1DataContext().Users
select new MyUser // Can this be avoided with AutoMapper AND extension methods?
{
FirstName = v.FirstName,
LastName = v.LastName
};