Лучшие практики использования таблиц типов LINQ +

StackOverflow https://stackoverflow.com/questions/118497

  •  02-07-2019
  •  | 
  •  

Вопрос

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

У меня есть таблицы в SQL, которые ограничивают значения типом values, и я хочу иметь возможность использовать это в своем коде на C # в качестве строго типизированных значений.

Мой текущий подход к типу 'PackageStatus' заключается в следующем:

Таблица SQL

PackageStatusType (int)
desc (varchar)

Класс C # - с использованием LINQ

public class PackageStatusType
{
    static PackageStatusType()
    {

        var lookup = (from p in DataProvider.ShipperDB.PackageStatus
                      select p).ToDictionary(p => p.Desc);


        Unknown = lookup["Unknown"];
        LabelGenerated = lookup["Label generated"];
        ReadyForCollection = lookup["Ready for pickup"];
        PickedUp = lookup["Picked up"];
        InTransit = lookup["In Transit"];
        DeliveryAttempted = lookup["Delivery attempted"];
        DeliveredByHand = lookup["By hand"];
        DeliveryFailed = lookup["Delivery failed"];
        Delivered = lookup["Delivered"];
        Voided = lookup["Voided"];
    }

    public static ShipperDB.Model.PackageStatus Unknown;
    public static ShipperDB.Model.PackageStatus LabelGenerated;
    public static ShipperDB.Model.PackageStatus ReadyForCollection;
    public static ShipperDB.Model.PackageStatus PickedUp;
    public static ShipperDB.Model.PackageStatus InTransit;
    public static ShipperDB.Model.PackageStatus DeliveryAttempted;
    public static ShipperDB.Model.PackageStatus DeliveryFailed;
    public static ShipperDB.Model.PackageStatus Delivered;
    public static ShipperDB.Model.PackageStatus DeliveredByHand;
    public static ShipperDB.Model.PackageStatus Voided;
}

Тогда я могу поставить PackageStatusType.Delivered в моем коде C #, и он будет корректно ссылаться на правильный объект LINQ.

Это работает нормально, но заставляет меня задуматься:

а) как я могу сделать это более эффективным б) почему Microsoft, похоже, не предоставляет ничего для создания строго типизированных таблиц типов в) хорош ли вообще дизайн моей базы данных?г) что делают все остальные!

Спасибо!

Это было полезно?

Решение

Linq to SQL позволяет вам сопоставить строку или столбец int в базе данных с перечислением в вашем коде C #.Это позволяет вам разрешить Linq to SQL сопоставлять эти значения для вас при выборе из базы данных.В этом случае я бы изменил столбец состояния моего пакета, чтобы он был либо столбцом int со значениями из перечисления, либо строкой, представляющей значения из перечисления.

В вашем случае у меня было бы перечисление PackageStatus с различными указанными вами значениями, а затем, используя ORM designer или SQLMetal, сопоставьте этот столбец с этим перечислением.Единственное предостережение заключается в том, что строковые значения в столбце базы данных должны совпадать со значениями в перечислении, поскольку Linq to SQL будет использовать Enum.Parse() для сопоставления строковых значений из базы данных с перечислением или проверки того, что значения int в базе данных соответствуют значениям из перечисления.

Это более эффективно, поскольку вам вообще не нужно сопоставлять таблицу подстановки в коде.

http://msdn.microsoft.com/en-us/library/bb386947.aspx#EnumMapping описывает, как это работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top