c # вопрос о соединении 2-х одинаковых таблиц с другой таблицей с использованием структуры сущностей Lambda и MySql - PullRequest
0 голосов
/ 17 января 2019

Проблема, с которой я столкнулся при изменении структуры таблицы текущей базы данных, которая использовалась для получения всех данных учетной записи в объединенном запросе. Основной запрос, который у меня есть в c #:

subscriptions = context.Subscriptions
    .Include("SubscriberAccount").Include("ProviderAccount")
    .Where(s => s.ProviderAccount.account_number != null && 
                s.ProviderAccount.mt4_auth_broker != null && 
                s.ProviderAccount.name != "new unidentified").ToList();

Когда я Console.WriteLine () этого контекста, я получаю это взамен:

SELECT
`Extent1`.`ID`, 
`Extent1`.`ProviderAccountId`, 
`Extent1`.`SubscriberAccountId`,  
`Extent3`.`id` AS `ID1`, 
`Extent3`.`user_id`, 
`Extent3`.`account_number`, 
`Extent3`.`mt4_auth_broker`, 
`Extent3`.`mt4_auth_password`, 
`Extent3`.`name`, 
`Extent2`.`id` AS `ID2`, 
`Extent2`.`user_id` AS `user_id1`, 
`Extent2`.`account_number` AS `account_number1`, 
`Extent2`.`mt4_auth_broker` AS `mt4_auth_broker1`, 
`Extent2`.`mt4_auth_password` AS `mt4_auth_password1`, 
`Extent2`.`name` AS `name1`
FROM `subcriptions` AS `Extent1` 
INNER JOIN `accounts` AS `Extent2` ON `Extent1`.`ProviderAccountId` = `Extent2`.`id`
INNER JOIN `accounts` AS `Extent3` ON `Extent1`.`SubscriberAccountId` = `Extent3`.`id`
WHERE ((`Extent2`.`account_number` IS NOT NULL) AND (`Extent2`.`mt4_auth_broker` IS NOT NULL)) AND (NOT ((@gp1 = `Extent2`.`name`) AND (`Extent2`.`name` IS NOT NULL)))
  • Extent1 - это имя таблицы subsctiptions, где хранятся ProviderAccountId и SubscriberAccountId.
  • Extent2 and Extent3 - это имя таблицы accounts

Этот запрос должен возвращать все данные с объединенными таблицами в 1 строку, но вместо него указывается id, чтобы указывать на user_id. Другая проблема, с которой я сталкиваюсь, - это когда я пытаюсь получить все данные учетной записи для ProviderAccountId и SubscriberAccountId из accounts и соединить их с subscriptions в той же строке, я ничего не получаю, вероятно, потому что у SubscriberAccountId есть несколько учетных записей с то же самое user_id. Когда все работало, это была структура таблицы: перед тем

table name "subscriptions"
ID, ProviderAccountId, SubscriberAccountId, ..........

table name "accounts"
ID, MT4AccountNumber, MT4AccountPassword, MT4AccountBroker, Name ......

Я создал новую таблицу, поскольку мне нужно использовать несколько учетных записей для каждого идентификатора, и теперь идентификатор больше не является уникальным. Новая структура таблицы:

table name "subscriptions"
ID, ProviderAccountId, SubscriberAccountId, ..........

table name "accounts"
id, user_id, account_number, mt4_account_password, mt4_account_broker, name ......

Существует также класс subscriptions, который имеет 2 виртуальных свойства, связанных с классом accounts, а также другие классы.

public class subcriptions
{
    public int ID { get; set; }
    public int ProviderAccountId { get; set; }
    public int SubscriberAccountId { get; set; }
    public virtual accounts ProviderAccount { get; set; }
    public virtual accounts SubscriberAccount { get; set; }
}

public class accounts
{
    public int id { get; set; }
    public int user_id { get; set; }
    public int? account_number { get; set; }
    public string mt4_auth_broker { get; set; }
    public string mt4_auth_password { get; set; }
    public string name { get; set; }
}

public class orders
{
    public int ID { get; set; }
    public int AccountId { get; set; }
    public virtual accounts Account { get; set; }
    public int? MT4AccountNumber { get; set; }
}

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

И как мне сделать запрос, чтобы использовать user_id вместо id, как

INNER JOIN `accounts` AS `Extent2` ON `Extent1`.`ProviderAccountId` = `Extent2`.`user_id`
INNER JOIN `accounts` AS `Extent3` ON `Extent1`.`SubscriberAccountId` = `Extent3`.`user_id`
...