Объединение между 3 таблицами

#c# #linq #join

#c# #linq #Присоединиться

Вопрос:

У меня есть 3 таблицы User, HumanCustomer, CompanyCustomer Я хочу объединить таблицы с помощью LINQ, но мой запрос не работает, и он возвращает null

Запрос:

 var query = (from users in _ctx.Users
                         join hCustomer in _ctx.HumanCustomers on users.Id equals hCustomer.UserId
                         join cCustomer in _ctx.CompanyCustomers  on users.Id equals cCustomer.UserId
                         select new
                         {
                             users.Id,
                             users.Mobile,
                             hCustomer.LastName,
                             hCustomer.Name,
                             cCustomer.CompanyName
                         });
 foreach (var item in query)
            {
                AllCustomerViewModel allCustomer = new AllCustomerViewModel();

                if (item.Name != null)
                {
                    allCustomer.UserId = item.Id;
                    allCustomer.FullName = item.Name   item.LastName;
                    allCustomer.Mobile = item.Mobile;
                    Customer.Add(allCustomer);
                }
}
  

Код не вводится для каждого

Я думаю, что проблема заключается в использовании идентификатора пользователя дважды, потому что, когда я удаляю

 join cCustomer in _ctx.CompanyCustomers  on users.Id equals cCustomer.UserId
  

запрос выполняется правильно.

Комментарии:

1. Не уверен в данных, но да, вам, вероятно, нужно использовать таблицу пользователя дважды, но псевдоним с другим именем

2. Как использовать? @Brad

3. возможно, ваша таблица CompanyCustomers пуста, или столбец ‘userId’ имеет нулевое значение. Вы можете проверить?

4. Что происходит, когда вы пишете этот запрос в редакторе sql? Вероятно, какое-то поле равно нулю, и из-за этого результат равен нулю.

5. Проверьте свои данные в таблицах, убедитесь, что все 3 таблицы содержат одинаковое значение идентификатора пользователя

Ответ №1:

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

Вы могли бы попробовать:

 foreach (dynamic item in query)
  

В качестве альтернативы, вы пишете класс для хранения выбранных вами значений, обновляя начало вашего запроса до:

 var query = (from users in _ctx.Users
                     join hCustomer in _ctx.HumanCustomers on users.Id equals hCustomer.UserId
                     join cCustomer in _ctx.CompanyCustomers  on users.Id equals cCustomer.UserId
                     select new MyClass
                     {
                         Id = users.Id,
                         Mobile = users.Mobile,
                         LastName = hCustomer.LastName,
                         Name = hCustomer.Name,
                         CompanyName = cCustomer.CompanyName
                     });
  

Ответ №2:

 you can try this way..

var query = (from users in _ctx.Users
                         join hCustomer in _ctx.HumanCustomers on users.Id equals hCustomer.UserId
                         join cCustomer in _ctx.CompanyCustomers  on users.Id equals cCustomer.UserId
                         select new
                         {
                             Id = users.Id,
                             Mobile = users.Mobile,
                             LastName = hCustomer.LastName,
                             Name = hCustomer.Name,
                             CompanyName = (cCustomer == null ? "" : cCustomer .CompanyName)
                         });
  

Комментарии:

1. каким образом этот ответ помогает?