powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Выборка из двух таблиц.
21 сообщений из 21, страница 1 из 1
Выборка из двух таблиц.
    #39895548
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Прошу прощения за возможный нубский вопрос. APS.Core, Linq и всё последующее только изучаю.

задача такая:
нужно по id вывести результаты из разных таблиц
в БД есть таблицы CLIENTS и ACCOUNTS, и куча других связанных с этими

таблица CLIENTS
поле тип переменной ключCLIENTID int Primary key CLIENTCODE nvarchar CATEGORYID int Foreign key FIRSTNAME nvarchar LASTNAME nvarchar...

таблица ACCOUNTS
поле тип переменной ключACCOUNTID int Primary key CLIENTID int Foreign key ACCOUNTCODE stringCATEGORIES int Foreign key BALANCE decimal...

Таблица ACCOUNTS ссылается на таблицу CLIENTS через ключ CLIENTID. Сама таблица CLIENTS имеет ещё кучу разных включений, например CATEGORYID берёт данные из CLIENTCATEGORIES.
Я реализовал вывод таблицы CLIENTS (автосоздание контроллера MVC с редактированием, удалением и выводом..сущностей)
Теперь я хочу чтобы при нажатии кнопки Details выводились данные по клиенту (которые находятся в модели клиенты) и данные из таблицы ACCOUNTS с условием, где CLIETNID = выбранному id

сделать это в sql просто, где N - нужный ID
Код: sql
1.
2.
3.
select * from CLIENTS Cl
inner join ACCOUNTS Acc on Acc.CLIENTS = Cl.CLIENTS
where Acc.CLIENTS = N



Помогите реализовать это в C# ASP.Core?

Вот так выглядит первоначальный код Details сгенерированный контроллером. Код выводит данные по клиенту и подставляет в поле CATEGORYID вместо значения int расшифровку поля из таблицы CLIENTCATEGORIES по ключу CATEGORYID

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var cLIENTS = await _context.CLIENTS
                .Include(c => c.CATEGORY)
                .FirstOrDefaultAsync(m => m.CLIENTID == id);
            if (cLIENTS == null)
            {
                return NotFound();
            }
            return View(cLIENTS);
        }



Резюме. Нужно к выводу детальной информации по клиенту добавить информацию из таблицы ACCOUNTS связанных по полю CLIENTID. При этом к 1 клиенту может быть привязано несколько ACCOUNTS.

Надеюсь вопрос мой понятен =)
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39895611
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо приводить таблицы, приведи лучше код сущностей.

А в целом - просто добавляй еще Include и ThenInclude в нужных местах
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39895633
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Надеюсь правильно понимаю понятие сущности
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CRM.Models
{
    public class _DB : DbContext
    {
        public _DB(DbContextOptions<_DB> options) : base(options)
        {

        }
        public DbSet<CLIENTS> CLIENTS { get; set; }
        public DbSet<CLIENTCATEGORIES> CLIENTCATEGORIES { get; set; }
        public DbSet<ACCOUNTS> ACCOUNTS { get; set; }
        public DbSet<BILLINGPLANS> BILLINGPLANS { get; set; }
        public DbSet<CATEGORIES> CATEGORIES { get; set; }
        public DbSet<DialRuleSets> DialRuleSets { get; set; }
        public DbSet<RadiusReplySets> RadiusReplySets { get; set; }
        public DbSet<CURRENCIES> CURRENCIES { get; set; }
    }
}
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39895636
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EltsVV
Надеюсь правильно понимаю понятие сущности
нет, то есть учебник не читался, как я понимаю, а надо бы

Сущность - CLIENTS, ACCOUNTS и т.п.
Кстати, принятно называть классы сущностей в единственном числе; имена классов в принципе - строчными буквами, начиная с заглавной, а такое "var cLIENTS" даже в страшном сне не могло присниться.

Учитесь сразу писать код так, чтобы его легко читали другие люди.
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39895651
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Я приношу свои извинения за некрасоту написания, название классов и переменных взято из готовой БД привить которую я не могу.
Книжку читаю, но большой объём не сразу откладывается в голове. А сроки поставленные руководством уменьшаются быстрее скорости моего чтения ;)

Пока есть общее понимание. Предыдущий опыт работы с БД был совершенно иным и на технологиях WinForms. Поэтому извините за нубство...

Модель CLIENTS
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace CRM.Models
{
    public class CLIENTS
    {
        [Key]
        public int? CLIENTID { get; set; }
        [Display(Name = "№договора")]
        public string CLIENTCODE { get; set; }
        [HiddenInput(DisplayValue = false)]
        [ScaffoldColumn(false)]
        public decimal? CLIENTTYPE { get; set; }
        public int? CATEGORYID { get; set; }
        [Display(Name = "Категория абонента")]
        public virtual CLIENTCATEGORIES CATEGORY { get; set; }
        [ScaffoldColumn(false)]
        public string FIRSTNAME { get; set; }
        [ScaffoldColumn(false)]
        public string LASTNAME { get; set; }
        [ScaffoldColumn(false)]
        public string SURNAME { get; set; }
        [ScaffoldColumn(false)]
        public string ORGANIZATION { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_ADRESS_POLUCH { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_ADRESS_PLAT { get; set; }
        [ScaffoldColumn(false)]
        public string DOGOVOR { get; set; }
        [Display(Name = "ИНН")]
        public string VAR_INN { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_KPP { get; set; }
        [ScaffoldColumn(false)]
        public int? var_AddressId { get; set; }
        [ScaffoldColumn(false)]
        public string var_Comments { get; set; }
        [ScaffoldColumn(false)]
        public decimal? ADVANCEPAYMENT { get; set; }
        [ScaffoldColumn(false)]
        public decimal? CURRENCYID { get; set; }
        [ScaffoldColumn(false)]
        public int? PARENTID { get; set; }
        [ScaffoldColumn(false)]
        public decimal? ISOPERATOR { get; set; }
        [ScaffoldColumn(false)]
        public int? STATE { get; set; }
        [Display(Name = "Название организации")]
        public string Name { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_AGENT_DOG { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_SHORT_NAME { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_V_LICE { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_DEIST { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_PLAT { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_E_MAIL { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_INFO { get; set; }
        [ScaffoldColumn(false)]
        [Display(Name = "Банк")]
        public string VAR_bank_poluch { get; set; }
        [ScaffoldColumn(false)]
        [Display(Name = "БИК")]
        public string VAR_bik_bank_poluch { get; set; }
        [ScaffoldColumn(false)]
        [Display(Name = "Кор/счёт")]
        public string VAR_CH_banka_poluch { get; set; }
        [ScaffoldColumn(false)]
        [Display(Name = "Р/счёт")]
        public string VAR_ch_poluch { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_kod_gruzpoluch { get; set; }
        [ScaffoldColumn(false)]
        public int? VAR_type_connect { get; set; }
        [ScaffoldColumn(false)]
        public int? VAR_bank { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_MobNumber { get; set; }
        [Display(Name = "Договор подписан")]
        public DateTime? BeginTime { get; set; }
        [Display(Name = "Закрытие договора")]
        public DateTime? EndTime { get; set; }
        [HiddenInput(DisplayValue = false)]
        [ScaffoldColumn(false)]
        public string VAR_FullNAME { get; set; }
        [ScaffoldColumn(false)]
        public string VAR_AdressPOST { get; set; }
        [ScaffoldColumn(false)]
        public string PositionRP { get; set; }
        [ScaffoldColumn(false)]
        public string PositionIP { get; set; }
        [ScaffoldColumn(false)]
        public string PersonRP { get; set; }
        [ScaffoldColumn(false)]
        public int? ContragentID { get; set; }
        [ScaffoldColumn(false)]
        public bool? TelephoneCalls { get; set; }
        [ScaffoldColumn(false)]
        public string NumberOfTelephoneCalls { get; set; }
        [ScaffoldColumn(false)]
        public int? PersonalManagerID { get; set; }
        [ScaffoldColumn(false)]
        public int? SigningContract { get; set; }
        [ScaffoldColumn(false)]
        public int? PasportObjectID { get; set; }
        [ScaffoldColumn(false)]
        public string TelefonForBill { get; set; }
        [ScaffoldColumn(false)]
        public string AddressForBill { get; set; }
        [ScaffoldColumn(false)]
        public string EmailForBill { get; set; }
     
    }
}


Модель ACCOUNTS
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace CRM.Models
{
    public class ACCOUNTS                                           // Лицевые счета Абонентов (ДОГОВОРЫ)
    {
        [Key]
        public int ACCOUNTID { get; set; }                          //
        public int CLIENTID { get; set; }                           // Привязка к абоннету
        public virtual CLIENTS CLIENTS { get; set; }                // Модель абонента
        public string ACCOUNTCODE { get; set; }                     // Код развозки
        [ScaffoldColumn(false)]
        public int? ACCOUNTTYPE { get; set; }                       // ХЗ
        [ScaffoldColumn(false)] 
        public int? CATEGORYID { get; set; }                        // Категория ЛС (инет, канал, тел и пр.)
        public virtual CATEGORIES CATEGORIES { get; set; }          // Модель категории ЛС
        [ScaffoldColumn(false)] 
        public string CONTRACT { get; set; }                        // Договор
        [ScaffoldColumn(false)] 
        public DateTime? BEGINTIME { get; set; }                    // Дата открытия
        [ScaffoldColumn(false)] 
        public DateTime? ENDTIME { get; set; }                      // Дата закрытия
        [ScaffoldColumn(false)] 
        public decimal? ARRIVAL { get; set; }                       // ХЗ
        [ScaffoldColumn(false)]
        public decimal? CHARGE { get; set; }                        // ХЗ
        [ScaffoldColumn(false)] 
        public decimal? BALANCE { get; set; }                       // ХЗ
        [ScaffoldColumn(false)] 
        public int? CURRENCYID { get; set; }                        // Валюта по договору
        public virtual CURRENCIES CURRENCY { get; set; }            // Привязка к модели
        [ScaffoldColumn(false)] 
        public int? LASTCURRENCYID { get; set; }                    // ХЗ
        [ScaffoldColumn(false)] 
        public int? PARENTID { get; set; }                          // ХЗ
        [ScaffoldColumn(false)] 
        public string COMMENTS { get; set; }                        // ХЗ комментарий
        [ScaffoldColumn(false)] 
        public string NAME { get; set; }                            // Название договора
        [ScaffoldColumn(false)] 
        public int? WORKID { get; set; }                            // ХЗ
        [ScaffoldColumn(false)] 
        public string WORK { get; set; }                            // ХЗ
        [ScaffoldColumn(false)] 
        public int? CONTRACTTYPEID { get; set; }                    // ХЗ
        [ScaffoldColumn(false)] 
        public int? ACCOUNTTYPEID { get; set; }                     // ХЗ
        [ScaffoldColumn(false)] 
        public int? BILLINGPLANID { get; set; }                     // Категория Тарифного план
        [ScaffoldColumn(false)] 
        public string Login { get; set; }                           //
        [ScaffoldColumn(false)] 
        public string Password { get; set; }                        //
        [ScaffoldColumn(false)] 
        public string VAR_NUL_TRAN { get; set; }                    //
        [ScaffoldColumn(false)] 
        public int? WebAccess { get; set; }                         //
        [ScaffoldColumn(false)] 
        public decimal? MinimalBalance { get; set; }                //
        [ScaffoldColumn(false)] 
        public int? VAR_dash { get; set; }                          //
        [ScaffoldColumn(false)] 
        public string Salt { get; set; }                            //
        [ScaffoldColumn(false)] 
        public string Hash { get; set; }                            //
        [ScaffoldColumn(false)] 
        public int? VAR_adrFromAKT { get; set; }                    //
        [ScaffoldColumn(false)] 
        public int? VAR_adrFromArnHide { get; set; }                //
        [ScaffoldColumn(false)] 
        public int? VAR_InnFromAktHide { get; set; }                //
        [ScaffoldColumn(false)]
        public int? VAR_GruzPoluchHeAlsoPlat { get; set; }          //
        [ScaffoldColumn(false)]
        public int? VAR_PoluchFromAktHide { get; set; }             //
        [ScaffoldColumn(false)]
        public int? VAR_GruzOtprFromShFakt { get; set; }            //
        [ScaffoldColumn(false)]
        public int? VAR_DataPlat { get; set; }                      //
        [ScaffoldColumn(false)]
        public int? VAR_dashAll { get; set; }                       //
        [ScaffoldColumn(false)]
        public int? var_GruzPoluchFromShFakt { get; set; }          //
        [ScaffoldColumn(false)]
        public decimal? var_DateOfLastPromisedPayment { get; set; } //
    }
}
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39895688
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе в сущность клиента нужно добавить поле
Код: c#
1.
public virtual List<ACCOUNTS> AccountList { get; set; }


после чего можешь инклюдить
Код: c#
1.
2.
3.
4.
            var cLIENTS = await _context.CLIENTS
                .Include(c => c.CATEGORY)
                .Include(c => c.AccountList)
                .FirstOrDefaultAsync(m => m.CLIENTID == id);
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39896073
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Благодарю за помощь! Дальше постараюсь разобраться. Либо буду писать сюда, чтобы не разводить разных тем.
Спасибо.
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39896324
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Прописал новые модели ACTIVESERVICESFORACCOUNTS и SERVICES
В контроллере сначала добавил .ThenInclude(c => c.ActivServiceList) всё работает, вывод из таблицы Active есть.
Пытаюсь шагнуть на уровень глубже ( .ThenInclude(d => d.ServiceList) ) вылетает ошибка

Код: sql
1.
2.
SqlException: Invalid column name 'ACTIVESERVICESFORACCOUNTSACTIVESERVICESFORACCOUNTID'.
Invalid column name 'ACTIVESERVICESFORACCOUNTSACTIVESERVICESFORACCOUNTID'.




Получается из сущности Services мне нужно получить Name для выбранного Клиента из сущности Clients.
Чтобы дойти до поля Services.Name нужно пройти по цепочке
Код: sql
1.
2.
3.
Clients(ClientID) -> Accounts (ClientID)
Accounts(AccountID)-> ActiveServicesForaccounts(AccountID)
ActiveServicesForaccounts(ServicesID)->Services(ServicesID)



Такое ощущение, что второй ThenInclude цепляется к AccountList вместо ActivServiceList



Контроллер
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var cLIENTS = await _context.CLIENTS
                .Include(c => c.CATEGORY)
                .Include(c => c.AccountList)
                .ThenInclude(b => b.ActivServiceList)
                .ThenInclude(d => d.ServiceList)
                .FirstOrDefaultAsync(m => m.CLIENTID == id);

            if (cLIENTS == null)
            {
                return NotFound();
            }

            return View(cLIENTS);



Сущность ACTIVESERVICESFORACCOUNTS
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
namespace CRM.Models
{
    public class ACTIVESERVICESFORACCOUNTS
    {
        public virtual List<SERVICES> ServiceList { get; set; }
        [Key]
        public int ACTIVESERVICESFORACCOUNTID { get; set; }
        public int? ACCOUNTID { get; set; }
        public int? SERVICEID { get; set; }
        public DateTime? BEGINTIME { get; set; }
        public string VAR_NumberZakaz { get; set; }
        public DateTime? ENDTIME { get; set; }
        public decimal? AMOUNT { get; set; }
        public string CountType { get; set; }
        public int? VAR_AddressOborud { get; set; }
        public int? var_TypeConnect { get; set; }
    }
}



Сущность SERVICES
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
namespace CRM.Models
{
    public class SERVICES
    {
        [Key]
        public int SERVICEID { get; set; }
        public int? SERVICETYPE { get; set; }
        public string SERVICECODE { get; set; }
        public string NAME { get; set; }
        public int? SERVCATEGORYID { get; set; }
        public int? DIMENSIONID { get; set; }
        public int? SERVICESUBTYPEID { get; set; }
    }
}



View
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<dd>
@{
        foreach (var Acc in Model.AccountList)
        {
             <p>№@Acc.CONTRACT &nbsp;&nbsp; | @Acc.NAME </p>
             <p> 
             @{
                     foreach (var ActivAcc in Acc.ActivServiceList)
                     {
                          foreach (var Serv in ActivAcc.ServiceList)
                          { <p>@Serv.NAME.ToString() </p> }
                     }
                }
                       </p>
        }
   }
</dd>



Заранее благодарю.
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39896344
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EltsVV
Такое ощущение, что второй ThenInclude цепляется к AccountList вместо ActivServiceList
не должен.

Но где объявлен ActivServiceList я не вижу
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39896420
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
EltsVV
Такое ощущение, что второй ThenInclude цепляется к AccountList вместо ActivServiceList
не должен.

Но где объявлен ActivServiceList я не вижу


Прошу прощения!
ActivServiceList я по аналогии с Вашей предыдущей подсказкой объявил в ACCOUNTS
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
namespace CRM.Models
{
    public class ACCOUNTS                                           // Лицевые счета Абонентов (ДОГОВОРЫ)
    {
        public virtual List<ACTIVESERVICESFORACCOUNTS> ActivServiceList { get; set; }
        [Key]
        public int ACCOUNTID { get; set; }                          //
        public int CLIENTID { get; set; }                           // Привязка к абоннету
        public virtual CLIENTS CLIENTS { get; set; }                // Модель абонента
        public string ACCOUNTCODE { get; set; }                     // Код развозки
        [ScaffoldColumn(false)]
        public int? ACCOUNTTYPE { get; set; }                       // ХЗ
        [ScaffoldColumn(false)] 
        public int? CATEGORYID { get; set; }                        // Категория ЛС (инет, канал, тел и пр.)
        public virtual CATEGORIES CATEGORIES { get; set; }          // Модель категории ЛС
        [ScaffoldColumn(false)] 
        public string CONTRACT { get; set; }                        // Договор
        ...      
        ...      
        ...      
        [ScaffoldColumn(false)]
        public int? var_GruzPoluchFromShFakt { get; set; }          //
        [ScaffoldColumn(false)]
        public decimal? var_DateOfLastPromisedPayment { get; set; } //
    }
}



Также внёс данные по новым таблицам в DbContext
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
namespace CRM.Models
{
    public class _DB : DbContext
    {
        public _DB(DbContextOptions<_DB> options) : base(options) { }

        public DbSet<CLIENTS> CLIENTS { get; set; }
        public DbSet<CLIENTCATEGORIES> CLIENTCATEGORIES { get; set; }
        public DbSet<ACCOUNTS> ACCOUNTS { get; set; }
        public DbSet<BILLINGPLANS> BILLINGPLANS { get; set; }
        public DbSet<CATEGORIES> CATEGORIES { get; set; }
        public DbSet<DialRuleSets> DialRuleSets { get; set; }
        public DbSet<RadiusReplySets> RadiusReplySets { get; set; }
        public DbSet<CURRENCIES> CURRENCIES { get; set; }
        public DbSet<ACTIVESERVICESFORACCOUNTS> ACTIVESERVICESFORACCOUNTS { get; set; }
        public DbSet<SERVICES> SERVICES { get; set; }
    }
}
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39896423
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Судя по ошибке, он пытается найти поле "ACTIVESERVICESFORACCOUNTSACTIVESERVICESFORACCOUNTID"
Только не понимаю почему он генерирует это имя.
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39896427
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EltsVV
Судя по ошибке, он пытается найти поле "ACTIVESERVICESFORACCOUNTSACTIVESERVICESFORACCOUNTID"
даже EF задолбался читать эти невменяемые имена )
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39896487
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

В том то и дело что эту порнографию он читает.
Данные из ACTIVESERVICESFORACCOUNTS выводятся но в самой таблице хранятся коды, а расшифровка кодов лежит в SERVICES и когда я добавляю последний иннер джоин он крашется....
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39896529
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так SERVICES же не ссылается на ACTIVESERVICESFORACCOUNTS

зачем ты в ACTIVESERVICESFORACCOUNTS добавил List<SERVICES>, если там ссылка просто на один SERVICES
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39897401
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Благодарю за помощь. Получилось так, чтобы получить доступ к
Код: sql
1.
2.
3.
Clients(ClientID) -> Accounts (ClientID)
Accounts(AccountID)-> ActiveServicesForaccounts(AccountID)
ActiveServicesForaccounts(ServicesID)->Services(ServicesID)



по сущностям прописал таким образом:
Клиенты, добавляем АккаунтЛист, так как у 1 клиента моет быть несколько аккаунтов
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 public class CLIENTS
    {
        public virtual List<ACCOUNTS> Account { get; set; }
        [Key]
        public int? CLIENTID { get; set; }
        [Display(Name = "№договора")]
        public string CLIENTCODE { get; set; }
        [HiddenInput(DisplayValue = false)]
        [ScaffoldColumn(false)]
        public decimal? CLIENTTYPE { get; set; }
        public int? CATEGORYID { get; set; }
        [Display(Name = "Категория абонента")]
        public virtual CLIENTCATEGORIES CATEGORY { get; set; }
        ...
        [ScaffoldColumn(false)]
        public string EmailForBill { get; set; }
    }



В Аккаунты добавлем АктивЛист, так как у 1 аккаунта может быть несколько автивных услуг
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class ACCOUNTS                                           // Лицевые счета Абонентов (ДОГОВОРЫ)
    {
        public virtual List<ACTIVESERVICESFORACCOUNTS> ActivServiceList { get; set; }
        [Key]
        public int ACCOUNTID { get; set; }                          //
        public int CLIENTID { get; set; }                           // Привязка к абоннету
        public virtual CLIENTS CLIENTS { get; set; }                // Модель абонента
        ...
        [ScaffoldColumn(false)]
        public decimal? var_DateOfLastPromisedPayment { get; set; } //
    }



В АктивныеАккаунты добавляем модель Service, которая ссылается на конкретную расшифровку
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class ACTIVESERVICESFORACCOUNTS
    {
        public virtual SERVICES Service { get; set; }
        [Key]
        public int ACTIVESERVICESFORACCOUNTID { get; set; }
        public int? ACCOUNTID { get; set; }
        public int? SERVICEID { get; set; }
        ...
        public int? var_TypeConnect { get; set; }
    }



Сущность SERVICES оставляем как она есть
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class SERVICES
    {
        [Key]
        public int SERVICEID { get; set; }
        public int? SERVICETYPE { get; set; }
        public string SERVICECODE { get; set; }
        public string NAME { get; set; }
        public int? SERVCATEGORYID { get; set; }
        public int? DIMENSIONID { get; set; }
        public int? SERVICESUBTYPEID { get; set; }
    }



И далее во вью запускаем 2 цикла foreach для перебора. Сначала по Аккаунтам, затем по АктивнымАккунтам
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 <dd>
            @{
                foreach (var Acc in Model.Account)
                {
                    <p>
                    </p>
                    bool a = true;
                    foreach (var Asl in Acc.ActivServiceList)
                    {
                        a = false;
                        <p>@Acc.CONTRACT @Asl.Service.NAME @Asl.VAR_NumberZakaz @Asl.BEGINTIME - @Asl.ENDTIME</p>
                    }
                    if (a == true)
                    { <p>@Acc.CONTRACT</p> }
                <hr />
            }
            }
        </dd>


Тут за конструкцию If прошу сильно не ругать, пока не искал способоа вывести Acc.CONTRACT если ActivServiceList пуст

В контроллере прописал последовательность join'ов
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var cLIENTS = await _context.CLIENTS
                .Include(c => c.CATEGORY)
                .Include(c => c.Account)
                .ThenInclude(c => c.ActivServiceList)
                .ThenInclude(SERVICEID => SERVICEID.Service)
                .FirstOrDefaultAsync(m => m.CLIENTID == id);
            if (cLIENTS == null)
            {
                return NotFound();
            }
            return View(cLIENTS);
        }



В целом правильно понял логику взаимодействия?

P.S. И ещё раз спасибо за помощь.
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39897424
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EltsVV
В целом правильно понял логику взаимодействия?
Честно говоря, лень снова вникать в модель, да еще с таким перерывом. Работает - ну и ок.

Что касается правильности понимания - нужно просто прочитать учебник по EF, сделать пару тестовых примеров на Code First. Тогда и подобных вопросов не будет.
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39898132
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Что касается правильности понимания - нужно просто прочитать учебник по EF, сделать пару тестовых примеров на Code First. Тогда и подобных вопросов не будет.


Понял, пока читаю ASP.NET Core MVC 2 (А. Фримен).
Хотя с новой ошибкой надо искать книги EF...
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39898146
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Проблема простая.. у меня SQL 2003.
Сгенерировал автоконтроллер по сущности: mClaim
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 public class mClaim
    {
        public List<mClaimsADD> ClaimsADDList { get; set; }
        [Key]
        public int ID { get; set; }
        public int? ClaimTypeID { get; set; }
        [Display(Name = "Тип заявки")]
        public virtual ClaimTypes ClaimType { get; set; }
        public int ClientID { get; set; }
        [Display(Name = "Абонент")]
        public virtual CLIENTS Clietns { get; set; }
        [Display(Name = "Дата создания заявки")]
        [DisplayFormat(DataFormatString = "{0:dd'.'MM'.'yyyy'г.'}")]
        public DateTime? DateStart { get; set; }
        [Display(Name = "Последнее изменеие")]
        [DisplayFormat(DataFormatString = "{0:dd'.'MM'.'yyyy'г.'}")]
        public DateTime? LastDate { get; set; }
        public int? ClaimStatusID { get; set; }
        [Display(Name = "Статус заявки")]
        public virtual mClaimStatus ClaimStatus { get; set; }



При попытке сохранить данные в БД в таблицу Claims (как с пустыми полями дататайм, так и заполненными) вылетает ошибка.

Код: sql
1.
ArgumentException: The version of SQL Server in use does not support datatype 'datetime2'.



Суть ошибке понятна. Старая версия БД не держит новый тип датытайма.
В сети нашёл такое комментарий на ошибку:
Эта ошибка обычно происходит, как только вы добавляете обязательный (не нулевой) DATETIME столбец в существующую таблицу, и вы не устанавливаете значение до сохранения сущность для базы данных. В этом случае .NET будет отправлять значение по умолчанию который равен 1.1.0001, и это значение не вписывается в диапазон DATETIME. Этот (или что-то подобное) будет источником вашей проблемы.
Перепроверил БД. В таблице Claims все датытаймы позволяют Null. Из всех полей только ID Не Null.

Ещё находил, что в неком файле EDMX нужно прописать ProviderManifestToken=” 2005", но не могу понять, где искать этот файл и параметры.

Можете подсказать, как заставить EF сохранять данные в datetime вместо datetime2.

В общем пока читаю. Спасибо.
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39898152
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EltsVV
Перепроверил БД. В таблице Claims все датытаймы позволяют Null.
Это не значит, что какой-либо код не запишет в это поле default(DateTime), вызвав соответствующую ошибку.


EltsVV
Можете подсказать, как заставить EF сохранять данные в datetime вместо datetime2.
https://docs.microsoft.com/ru-ru/ef/core/modeling/relational/data-types
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39898156
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выбирай
modelBuilder.Entity<PageContent>()
.Property(f => f.DateModified)
.HasColumnType("datetime2");

глобально
modelBuilder.Properties<DateTime>()
.Configure(c => c.HasColumnType("datetime2"));

атрибутом
[Column(TypeName="datetime2")]
public DateTime DateModified{ get; set; }

указать точность
modelBuilder.Entity<PageContent>()
.Property(f => f.DateModified)
.HasColumnType("datetime2")
.HasPrecision(0);
...
Рейтинг: 0 / 0
Выборка из двух таблиц.
    #39898393
EltsVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю! Благодарю за оперативную и большую помощь в мелких вопросах.
Поду погружаться дальше в свистопляску формул и пикселей )))
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Выборка из двух таблиц.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]