Linq, EF Core - группировка по одному полю и использование другого поля для получения списка данных из другой таблицы - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь получить вывод от Linq в определенном формате.Этот вопрос был перефразирован -

Представление SQL - SomeView

    Id T_Id
    4   2 
    6   5
    6   7

Таблица SQL - Пользователь

    T_Id  fname lname
    2     mary   smith
    5     john    pope
    7     steve   blair

SomeView - это QueryType, я использовал DbQuery для его сопоставления.

    public class SomeView
    {
       public int Id {get; private set;}
       public int T_Id { get; private set; }

       public User User { get; set; } //can't navigate here
    }

    public class User
    {
       public int T_Id { get; set; }
       public string fname {get; set;}
       public string lname{get; set;}

       public SomeView SomeView{ get; set; } //can't navigate here
    }

В базе данных не определено ограничение внешнего ключа, так как SomeView - это представление SQL.Вы не можете использовать навигацию с QueryType.Поэтому отображение между User и SomeView невозможно или я не знаю, как это сделать.

     public class SomeViewModel
     {
        public int Id { get;  set; }
        public List Users{get; set;}
     }

finally my linq in progress - 

    from t in SomeView
    group new {t} by t.Id into grp
    select new SomeViewModel{
       Id = grp.Key,
       Users = grp.Select(x => x.t.User).ToList()
       //need help here to get Users based on T_Id
      }

Окончательный вывод данных API должен быть в следующем формате.

[{
  "Id" : "4",
  "users":[{
         "T_Id": 2,
         "fname": "mary",
         "lname": "smith"
      }]
},
{
  "Id" : "6",
  "users":[{
         "T_Id": 5,
         "fname": "john",
         "lname": "pope"
      },
      {
         "T_Id": 7,
         "fname": "steve",
         "lname": "blair"
      }
      ]
}]

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Наконец решил это так -

 public class SomeView
{
   public int Id {get; private set;}
   public int T_Id { get; private set; }

}

public class User
{
   public int T_Id { get; set; }
   public string fname {get; set;}
   public string lname{get; set;}
}

public class SomeViewModel
{
   public int Id { get;  set; }
   public List<User> Users{get; set;}
}

   from t in SomeView
   join u in User on v.T_Id equals u.T_Id
   group new {t, u} by t.Id into grp
   select new SomeViewModel{
      Id = grp.Key,
      Users = grp.Select(x => x.u).ToList()
  }

Это было легко:)

0 голосов
/ 26 апреля 2019

Во-первых, я думаю, что вы можете использовать любой сериализатор для преобразования ваших объектов в нужный вам формат.

var serialized = JsonConvert.SerializeObject(data)

Во-вторых, вернемся к вашему вопросу, вот код. Тем не менее, вам нужно добавить "вокруг ваших переменных и избавиться от конкатенации строк, которые я добавил для удобства чтения. Кроме того, этот код настолько специфичен для вашей проблемы, и для более общего решения воспользуйтесь первым подходом.

var mainData = string.Join(',', data.Select(x => $" {{ {nameof(x.Id)} :  {x.Id}, " +
                                                           $"{nameof(User)}s: " +
                                                           $"[ {string.Join(',', x.Users.Select(y => $"{{ {nameof(User.T_Id)} : {y.T_Id} }}"))}]" +
                                                           $"}}"));
var result = $"[{mainData}]" ;

Когда вы изменили вопрос, я обновил свой ответ. Итак, вам нужно сначала присоединиться к someView и пользователю, чтобы собрать их вместе, а затем сгруппировать по someView.id. Вот код

        var someViewsUsersJoin = someViews.Join(users, l => l.t_id, r => r.t_id, (someView, user) => new {someView, user});

        var result = someViewsUsersJoin.GroupBy(x => x.someView.id).Select(x => new SomeViewModel()
        {
            Id = x.Key,
            Users = x.Select(y => y.user).ToList()
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...