Automapper MapFrom Subquery

1.1k Views Asked by At

UPDATE: Issue fixed in current release https://github.com/AutoMapper/AutoMapper/issues/742

Using AutoMapper 3.3, QueryableExtensions and EF6

I have a user requirement to return a Count of other users created before the current user.

I have the following

public class User 
   {
       public int Id {get;set;}
       public string Name { get; set; }
       public DateTime? DateActivated {get;set;}
   }

public class UserViewModel
   {
       public int Id {get;set;}
       public string Name { get; set; }
       public DateTime? DateActivated {get;set;}
       public int position {get;set;}
   }

public class AutoMapperConfig
{
    public static void ConfigAutoMapper() {

        var db = new DB();

        Mapper.CreateMap<User, UserViewModel>()
            .ForMember(a => a.position, opt => opt.MapFrom(src => db.Users.Where(u => u.DateActivated < src.DateActivated).Count()));

        Mapper.AssertConfigurationIsValid();
    }
}

and finally the actual mapping:

user = db.Users.Project().To<T>(new { db = db }).FirstOrDefault(a => a.id == id);

db is a local DbContext variable and I'm using AutoMapper parameters to insert it into the mapper (https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions#parameterization)

So far so good, this compiles and runs, but the result for user.position is 0

I checked with sql profiler and here is the relevant section of the generated query:

CROSS JOIN  (SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[Users] AS [Extent4]
            WHERE ([Extent4].[DateActivated] < [Extent4].[DateActivated]) ) AS [GroupBy1]

Notice how it refers to Extent4.DateActivated in both sides of the comparison, which will obviously yield 0 results.

So is what i'm doing just not possible? or did I do something wrong.

(and if I could do away with the parameterization and have automapper be able to refer to the current underlying db context that would be a bonus).

Thank you

EDIT

Just to make it clear, this count will be dynamic, since there are other criteria to filter prior users that I omitted from simplified the example.

0

There are 0 best solutions below