Проблема, с которой я столкнулся при изменении структуры таблицы текущей базы данных, которая использовалась для получения всех данных учетной записи в объединенном запросе.
Основной запрос, который у меня есть в 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`