-1

Это окрестности класс, окрестность может иметь много последователей:как вернуть данные из навигационных свойств от многого ко многие отношений

public class Neighbourhood 
{ 
    public Neighbourhood() 
    { 
    this.Followerss = new HashSet<ApplicationUser>();  
    } 
    [Key] 
    public int Id { get; set; } 
    public string NeighbourhoodName { get; set; } 
    //Calculated property 
    public virtual ICollection<ApplicationUser> Followerss { get; set; } 
} 

и это мой класс ApplicationUser, пользователь может следовать несколько окрестностей:

public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,> 
{ 
    public string Address { get; set; } 
    public ApplicationUser() 
    { 
    this.Followings = new HashSet<Neighbourhood>(); 
    } 
    public virtual ICollection<Neighbourhood> Followings { get; set; } 

Теперь, эти два имеют отношения многие ко многим друг с другом так, он создал новую таблицу в базу данных с именем NeighbourhoodApplicationUsers с колонкой (Neighbourhood_Id и ApplicationUser_Id).

Теперь я хочу, чтобы иметь метод, который будет возвращать обратно последователей соседства Итак, я написал это:

public virtual IEnumerable<NeighbourhoodProfileModel> GetFollowers(int userId) 
    { 
     var profiles = _context.Neighbourhoods 
      .SelectMany(u => u.Followerss) 
      .Select(u => new NeighbourhoodProfileModel 
      { 
       NeighbourhoodId = u., 
       NeighbourhoodName = u., 
       followersCount = u., 
       IsFollowed = u.Followings.Any(user => user.Id == userId), 
      }).ToList(); 
     return profiles; 
    } 

Я не знаю, как моделировать эту анонимную функцию здесь, я застрял здесь, я думаю, может быть, я делаю это неправильно. Положив (.) точку после u, он должен вернуть u.NeighbourhoodName что-то подобное, но возвращать данные, связанные с пользователем, а не получать данные, относящиеся к классу окрестности.

Если я прокомментирую строку .SelectMany (u => u.followerss), тогда я получу все необходимые свойства в анонимной функции.

Это мой взгляд модель:

public class NeighbourhoodProfileModel 
{ 
    public int NeighbourhoodId { get; set; } 
    public string NeighbourhoodName { get; set; } 
    public string City { get; set; } 
    public int postCount { get; set; } 
    public int followersCount { get; set; } 
    public int Followerss { get; set; } 
    public bool IsFollowed { get; set; } 
} 

Пожалуйста, предложите мне, как изменить GetFollowers метод возвращать обратно правильные данные.

ответ

0

Прежде всего, это работает, как и ожидалось, SelectMany принимает коллекцию Applicationusers от каждого Neighbourhood и ставит их все вместе в списке, так что, когда вы проецируете их, вы получите свойства ApplicationUser.

Во-вторых, что вы пытаетесь сделать, это просто не возможно, у вас есть много-ко-многим, так что, по определению, каждый Applicationuser может иметь несколько Neighbourhoods, как вы могли бы ожидать, чтобы найти один окрестность для каждого приложения, чтобы получить идентификатор и имя и т. д.? Я думаю, что отношения, которые вы ищете, являются «один ко многим», каждый район может иметь несколько приложений, но каждый пользователь приложения имеет только один район. Это даст вам ожидаемое поведение при проектировании пользователей в NeighbourhoodProfileModel.

Так что ваша ApplicationUser модель будет выглядеть следующим образом:

public class ApplicationUser : IdentityUser<int, CustomUserLogin,CustomUserRole,> 
{ 
    public string Address { get; set; } 

    public virtual Neighbourhood NeighbourHood { get; set; } 
} 

Если Applicationuser действительно нуждается в несколько кварталов, вы можете также выбрать, чтобы использовать Select вместо SelectMany. Это создаст список списков applicationuser для каждого соседства. Тогда проекция должна быть возможной.

И вам не нужна промежуточная таблица. Вам также нужно будет добавить первичный ключ Neighbourhood к вашему ApplicationUser как собственности вместе с атрибутом ForeignKey. (Если вы не выбрали для плавного отображения, что было бы еще лучше).

(Кстати, так как вы осуществляете в Neighbourhoodprofilemodel вы не анонимную функцию, что было бы в случае, если у вас .Select(u => new {})