Я пытаюсь использовать AutoMapper и шаблон хранилища вместе с плавным интерфейсом и сталкивается с трудностями с проекцией Linq. Для чего это стоит, этот код отлично работает при простом использовании объектов в памяти. Однако при использовании поставщика базы данных он разбивается при построении графика запроса. Я пробовал использовать SubSonic и Linq для SQL с тем же результатом. Спасибо за ваши идеи.Есть ли способ использовать прогнозы Linq с методами расширения
Вот метод расширения используется во всех сценариях - это источник проблемы, так как все прекрасно работает без использования методов расширения
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» домен object- в другие слова, я пытаюсь найти способ использовать 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
};
Я подумал о том, что нужно сначала вызвать ToList, но я бы не хотел называть это до момента, когда код действительно должен перечислить данные. Другими словами, ваш средний фрагмент кода попадает в базу данных в вызове перечислителя в цикле foreach (что хорошо в этом случае). Ваш последний фрагмент попадает в базу данных при вызове ToList. Это не будет работать в моем случае, так как методы расширения не находятся в проекте базы данных ... случай IoC, это одна из двух реализованных реализаций базы данных. –