Повторное использование кода с Linq-to-Sql - Создание «общих» справочных таблиц - PullRequest
1 голос
/ 24 августа 2009

В настоящее время я работаю над приложением в ASP.NET MVC, в котором есть несколько справочных таблиц, все в форме

LookUp {
  Id
  Text
}

Как видите, это просто отображает Id в текстовое значение. Они используются для таких вещей, как цвета. Теперь у меня есть несколько таких, в настоящее время 6 и, вероятно, скоро будет больше.

Я пытаюсь собрать API, который можно использовать через AJAX, чтобы позволить пользователю добавлять / перечислять / удалять значения из этих таблиц поиска, поэтому, например, у меня может быть что-то вроде:

http://example.com/Attributes/Colours/[List/Add/Delete]

Моя текущая проблема в том, что независимо от того, какую таблицу поиска я использую, все остальное происходит точно так же. Так что на самом деле не должно быть никакого повторения кода вообще.

В настоящее время у меня есть собственный маршрут, который указывает на «AttributeController», который вычисляет рассматриваемую атрибутивную / справочную таблицу на основе URL (т. Е. http://example.com/Attributes/Colours/List хотел бы таблицу «Цвета»). Я передаю атрибут (Цвета - строка) и операцию (Список / Добавить / Удалить), а также любые другие необходимые параметры (скажем, «Красный», если я хочу добавить красный в список) обратно в мой репозиторий, где происходит фактическое работа выполнена.

Здесь все становится грязно, так как в данный момент я прибегаю к переключению / регистру строки атрибута, который затем может получить сущность Linq-to-Sql, соответствующую конкретной таблице поиска. Я нахожу это довольно грязным, поскольку мне приходится писать одни и те же операции для каждой из искомых сущностей, тьфу!

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

Есть ли способ сделать это с моими сущностями Linq-To-Sql? Я попытался заставить их реализовать базовый интерфейс (IAttribute), который просто указывает свойства Id / Text, однако, что-то подобное делает не так:

System.Data.Linq.Table<IAttribute> table = GetAttribute("Colours");

Поскольку я не могу преобразовать System.Data.Linq.Table<Colour> в System.Data.Linq.Table<IAttribute>.

Есть ли способ сделать эти справочные таблицы "общими"?

Прошу прощения за то, что это что-то вроде мусорной свалки Здесь определенно не хватает информации, поэтому просто дайте мне знать, если вам нужны какие-либо подробности. Ура!

Ответы [ 2 ]

1 голос
/ 25 августа 2009

Вместо использования оператора switch вы можете использовать словарь поиска. Это psuedocode-ish, но это один из способов поставить под сомнение вашу таблицу. Вам придется вручную поддерживать словарь, но это должно быть намного проще, чем переключение.

Похоже, что метод DataContext.GetTable () может быть решением вашей проблемы. Вы можете получить таблицу, если знаете тип сущности linq, с которой хотите работать.

Dictionary<string, Type> lookupDict = new Dictionary<string, Type>
{
  "Colour", typeof(MatchingLinqEntity)
  ...
}

Type entityType = lookupDict[AttributeFromRouteValue];
YourDataContext db = new YourDataContext();
var entityTable = db.GetTable(entityType);
var entity = entityTable.Single(x => x.Id == IdFromRouteValue);
// or whatever operations you need
db.SubmitChanges()

В проекте Suteki Shop есть очень гладкая работа. Вы можете посмотреть на их реализацию IRepository<T> и IRepositoryResolver для общего шаблона хранилища. Это действительно хорошо работает с контейнером IoC, но вы можете создать их вручную с отражением, если производительность приемлема. Я бы использовал этот маршрут, если у вас есть или вы можете добавить контейнер IoC в проект. Вы должны убедиться, что ваш контейнер IoC поддерживает открытые дженерики, если вы идете по этому пути, но я уверен, что все основные игроки это делают.

1 голос
/ 24 августа 2009

У вас есть 2 варианта.

  1. Используйте Деревья выражений для динамического создания лямбда-выражения
  2. Используйте Dynamic LINQ , как описано в блоге Скотта Гу

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

Вот пример функции, которую я создал: (НЕ ПРОВЕРЕНО)

private static bool ValueExists<T>(String Value) where T : class
    {
        ParameterExpression pe = Expression.Parameter(typeof(T), "p");
        Expression value = Expression.Equal(Expression.Property(pe, "ColumnName"), Expression.Constant(Value));
        Expression<Func<T, bool>> predicate = Expression.Lambda<Func<T, bool>>(value, pe);
        return MyDataContext.GetTable<T>().Where(predicate).Count() > 0;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...