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

Я могу быть расплывчатым здесь, но я ищу хорошее место для размещения вспомогательных операций на основе наборов в linq, чтобы я мог делать такие вещи, как;

db.Selections.ClearTemporary()

который делает что-то вроде

db.DeleteAllOnSubmit(db.Selections.Where(s => s.Temporary))

Поскольку я могу понять, как расширить Table<Selection>, лучшее, что я могу сделать, это создать статический метод в частичном классе Selection (аналогично Ruby), но мне нужно передать контекст данных, например;

Selection.ClearTemporary(MyDataContext)

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

Я видел, как другие люди рекомендовали накапливать вспомогательные методы в части контекста данных, например;

myDataContext.ClearTemporarySelections();

Но я чувствую, что это делает DC свалкой для несплоченных операций.

Наверняка я что-то упускаю. Я надеюсь, что это так. Какая конвенция?


person Luke Rohde    schedule 30.03.2010    source источник


Ответы (2)


public static class LinqExtensions
{
  public static void Clear<T>(this Table<T> t, Expression<Func<T,bool>> pred)
  {
    t.DeleteAllOnSubmit(t.Where(pred));
  }
}

Использование:

db.Selections.Clear(x => x.Temporary);

При необходимости к DataContext можно получить доступ из Table<T>.

person leppie    schedule 30.03.2010
comment
Дает мне что-то еще для работы, но применяется ко всем сущностям. Поскольку .Selections на самом деле является геттером для универсального типа Table‹T›, а не класса, я полагаю, что расширение это тупик. Извините, что отвечаю так поздно, я никогда не получал уведомления по электронной почте об этом. - person Luke Rohde; 31.03.2010
comment
Добавление SubmitChanges — ужасная идея (крайне неинтуитивная с непредсказуемыми побочными эффектами). Я превращу свой -1 в +1 без него. - person Sam Harwell; 31.03.2010
comment
Я только что понял, что вы отлично ответили на заголовок вопроса - отличный ответ на глупый вопрос. Я отредактировал заголовок своего вопроса, но каков протокол? - person Luke Rohde; 31.03.2010
comment
Да, я был схематичен в отношении изменений отправки, так как это могло вызвать все виды хаоса для ничего не подозревающего пользователя. Однако я был очень рад обнаружить, что Table‹T› имеет контекстную ссылку на родительский контекст — я искал это в других сценариях. - person Luke Rohde; 31.03.2010
comment
@ 280Z28: Я знаю, это ужасно :) Это был пример того, как получить доступ к DataContext из таблицы, поэтому нужно передать только один параметр. - person leppie; 31.03.2010
comment
Но вам не нужен контекст данных, если вы его не отправляете. - person Sam Harwell; 31.03.2010
comment
@ 280Z28: Хорошо, я удалю это ... но Люк сказал, что у него «бремя» передачи контекста данных. Я просто показываю, что вам не нужен контекст данных, когда у вас уже есть таблица :) - person leppie; 31.03.2010

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

public SelectionsHelperClass SelectionsHelper {
  get {
    return new SelectionsHelperClass(Selections)
  }
}

Таким образом, я могу сделать db.SelectionsHelper.ClearTemporary() без передачи контекста, сохраняя при этом операции на основе наборов (операции сбора), специфичные для выбора, логически вместе. Я не тестировал это.

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

person Luke Rohde    schedule 30.03.2010
comment
Я проверил это, и это работает нормально. Мое первое использование было для таблицы поиска. Так что теперь я могу делать такие вещи, как db.LookupsHelper.GetDropDownValues(User.Type); вместо - from l в db.lookups, где атрибут == User.Type select new {l.lookupid, l.displaytext} - person Luke Rohde; 31.03.2010