Вот упрощенный пример моих моделей персистентности:
Код: Выделить всё
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection Roles { get; set; }
}
public class UserRole
{
public int Id { get; set; }
public int UserId { get; set; }
public User User { get; set; }
public string Role { get; set; }
}
< /code>
То, что я в настоящее время использую, является изменением шаблона спецификации, которая позволяет мне запустить переменную сумму .include /.theninclude < /code> в запросе перед выполнением. Полем Однако то, что я хочу иметь в состоянии сделать, это условное включение определенных частей проекции.
public class UserImpl
{
public User User { get; set; }
public int? RoleCount { get; set; }
public static Expression Projection(UserImplParams opts) {
return u => new UserImpl
{
User = u,
RoleCount = opts != null && opts.IncludeRoleCount ? u.Roles.Count() : default(int?)
};
}
}
public class UserImplParams
{
public bool IncludeRoleCount { get; set; }
}
< /code>
И то, чего я хотел бы достичь, - это способ сделать что -то похожее на это: < /p>
var opts= new UserImplParams
{
IncludeUserRole = true
};
await _databaseContext.Users.Select(UserImpl.Projection(opts)).ToListAsync();
< /code>
Мне бы хотелось, чтобы EF Core либо видит: < /p>
u => new UserImpl
{
User = u,
RoleCount = u.Roles.Count()
};
u => new UserImpl
{
User = u,
RoleCount = default(int?)
};
< /code>
Это возможно? Это в основном потому, что это выражение может содержать несколько проекционных свойств и даже вложенных. Ужигание всего этого в базу данных каждый раз только для нескольких данных кажется неэффективным.
Подробнее здесь: https://stackoverflow.com/questions/577 ... projection
Мобильная версия