I'm trying to use AutoMapper and a repository pattern along with a fluent interface, and running into difficulty with the Linq projection. For what it's worth, this code works fine when simply using in-memory objects. When using a database provider, however, it breaks when constructing the query graph. I've tried both SubSonic and Linq to SQL with the same result. Thanks for your ideas.
Here's an extension method used in all scenarios - It's the source of the problem since everything works fine without using extension methods
public static IQueryable<MyUser> ByName(this IQueryable<MyUser> users, string firstName)
{
return from u in users
where u.FirstName == firstName
select u;
}
Here's the in-memory code that works fine
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);
}
Here's the same thing using a SubSonic (or Linq to SQL or whatever) that fails. This is what I'd like to make work somehow with extension methods...
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);
}
The goal here is to avoid having to manually map the generated "User" object to the "MyUser" domain object- in other words, I'm trying to find a way to use AutoMapper so I don't have this kind of mapping code everywhere a database read operation is needed:
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
};