Дилемма таблицы поиска - PullRequest
       3

Дилемма таблицы поиска

0 голосов
/ 20 сентября 2018

У меня проблема с тем, как вернуть список организаций в зависимости от его типа.Позвольте мне описать схему:

Поиск таблицы для типов организации

TypeOfOrganization (table)
-- Id (Guid)[PK]
-- Type (varchar)

Пример данных

Id                                   Type                
------------------------------------ --------------------
0C54DECC-6A7B-463F-A160-20F3F270473E Company Location    
B07BE7A9-E569-43F7-B6D9-8A9B19F6D35C Mail Center         
BEA6E923-2170-40B0-9F54-8B6458DB75FD Client              
EBC8C254-FE87-4241-BA37-AD0B1FF5C370 Counsel             
F5EEEF8D-454D-430E-815E-CDFF942D28A0 Company             
5FDC2CD5-A0E9-4656-96C1-F365E67A1E42 Bank                
B4D25CD7-D695-4A6D-9E81-FDD673BDD2A3 Vendor            

Присоединение таблицы для Orginization к OrganizationTypes

OrganizationType (table)
-- Id (Guid)[PK]
-- OrganizationId (Guid)
-- TypeOfOrganizationId (Guid)

Пример данных

Id                                   OrganizationId                       TypeOfOrganizationId
------------------------------------ ------------------------------------ ------------------------------------
FECEC824-C5F4-41F8-9F5D-3236371A51B0 448FED23-393C-4019-87AE-0ED64764DFB1 F5EEEF8D-454D-430E-815E-CDFF942D28A0 (Company)
CEA03A1B-9E5F-49A5-BE04-9871A41986CF BEAAA39B-71BD-4F12-A570-FD71FEFD8503 F5EEEF8D-454D-430E-815E-CDFF942D28A0 (Company)
00998ACA-22D2-49D3-B2A2-CE2F3231B38A 1F87F1C5-44B9-4C60-9C38-001975229193 BEA6E923-2170-40B0-9F54-8B6458DB75FD (Client)
50CABBD2-CD55-4781-8BF3-83715216BF1A 6C8DC3B8-5A65-446E-A02B-02354FEDB3E3 BEA6E923-2170-40B0-9F54-8B6458DB75FD (Client)
5E60C5BF-4A36-4546-A3A9-818A1BC6E31B A315020C-268B-4F22-866C-034ACFC22A53 BEA6E923-2170-40B0-9F54-8B6458DB75FD (Client)
56629DFC-A78E-4092-8390-2ABFB21E6CB8 1BF7DAB9-7126-4DC8-A089-0169A52E9FF3 B4D25CD7-D695-4A6D-9E81-FDD673BDD2A3 (Vendor)
280AAE16-1732-44F7-8B8B-0357C5DAD2C4 7FC1BF63-6069-471D-85FC-09F4F5068DD2 B4D25CD7-D695-4A6D-9E81-FDD673BDD2A3 (Vendor)
... and more

К вашему сведению, в этой таблице не существует последнего столбца с именами типов организации, я просто поместил их там для лучшей визуализации структуры.

Таблица организации

Organization (table)
-- Id (Guid) [PK]
-- Name (varchar)

Пример данных

Id                                   Organization   
------------------------------------ ---------------
1F87F1C5-44B9-4C60-9C38-001975229193 Client A
6C8DC3B8-5A65-446E-A02B-02354FEDB3E3 Client B
A315020C-268B-4F22-866C-034ACFC22A53 Client C
448FED23-393C-4019-87AE-0ED64764DFB1 Company A
BEAAA39B-71BD-4F12-A570-FD71FEFD8503 Company B
1BF7DAB9-7126-4DC8-A089-0169A52E9FF3 Vendor A
7FC1BF63-6069-471D-85FC-09F4F5068DD2 Vendor B
00674C8A-34B9-46EF-B591-0C5EFBA4EB2B Vendor C
... and more

Мой вопрос: каков наилучший способ запроса организации определенного типа без использования класса Constants?

Пример:

  • Я хочу получить список всех организаций, являющихся клиентами.
  • Я хочу получить список всех организаций, являющихся поставщиками.
  • Я хочу получить список всех организаций, которые являются компаниями.

В настоящее время мой запрос Linq в моем проекте ASP.NET WebApi для получения списка поставщиков выглядит следующим образом:

var vendors = context.Organizations
    .Where(v => v.OrganizationTypes
       .Any(t => t.TypeOfOrganizationId == Constants.TypeOfOrganization_Vendor);

Это класс констант:

public static class Constants
{
    //TypeOfOrganization lookup table
    public static Guid TypeOfOrganization_Client = Guid.Parse("BEA6E923-2170-40B0-9F54-8B6458DB75FD");
    public static Guid TypeOfOrganization_Company = Guid.Parse("F5EEEF8D-454D-430E-815E-CDFF942D28A0");
    public static Guid TypeOfOrganization_Bank = Guid.Parse("5fdc2cd5-a0e9-4656-96c1-f365e67a1e42");
    public static Guid TypeOfOrganization_Location = Guid.Parse("0c54decc-6a7b-463f-a160-20f3f270473e");
    public static Guid TypeOfOrganization_Counsel = Guid.Parse("ebc8c254-fe87-4241-ba37-ad0b1ff5c370");
    public static Guid TypeOfOrganization_Vendor = Guid.Parse("b4d25cd7-d695-4a6d-9e81-fdd673bdd2a3");       
}

Я понимаю, что это не лучший способ справиться с этим, но в настоящее время я не могу найти надежный способ сделать это.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Здесь есть несколько вариантов.

  1. Создайте константы, как вы делаете.Тем не менее, это может быть больно.
  2. Выберите Id на основе фактического имени типа.Это немного более хрупко, поскольку имя может быть обновлено.
  3. Добавить еще один столбец идентификатора, который нельзя изменить.Это может быть int или другое имя, которое является строкой, которую нельзя изменять.Например, может установить поле при создании на пользовательском интерфейсе, но не может его обновить.Вы даже можете поместить индекс в этот столбец, чтобы сделать его быстрее.
0 голосов
/ 20 сентября 2018

Возможно, Guid - не лучший выбор для ПК TypeOfOrganization.Поскольку типы организации не являются произвольными, но имеют особые значения в приложении, вы можете сформулировать их как enum.

public enum OrgType
{
    None = 0,
    CompanyLocation = 1,
    MailCenter = 2,
    Client = 3,
    Counsel = 4,
    Company = 5,
    Bank = 6,
    Vendor = 7
}

и запросить с помощью

var vendors = context.Organizations
    .Where(v => v.OrganizationTypes
        .Any(t => t.TypeOfOrganizationId == OrgType.Vendor);

Если выневозможно изменить первичный ключ, добавьте новый обнуляемый столбец для известных типов организации, сопоставленный с enum.Затем прочитайте известные типы в словарь для поиска Guid по перечислению.

Dictionary<OrgType, Guid> knownOrgGuids = context.OrganizationTypes
    .Where(t => t.KnownType != null)
    .ToDictionary(t => t.KnownType, t => t.TypeOfOrganizationId);
Guid vendorGuid = knownOrgGuids[OrgType.Vendor];
var vendors = context.Organizations
    .Where(v => v.OrganizationTypes
        .Any(t => t.TypeOfOrganizationId == orgGuid);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...