2010-03-30 3 views
0

Возможно, я могу расхохотаться здесь, но я ищу прекрасное место для размещения на основе вспомогательных операций в linq, чтобы я мог делать что-то как;Что такое соглашение о расширении Linq datacontext с установленными на основе вспомогательными операциями, определенными только для одной коллекции объектов

db.Selections.ClearTemporary() 

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

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

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

Selection.ClearTemporary(MyDataContext) 

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

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

myDataContext.ClearTemporarySelections(); 

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

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

ответ

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>.

+0

Дает мне что-то другое для работы, но применимо ко всем объектам. Поскольку .Selections на самом деле является геттером для общего типа. Таблица , а не класс, я предполагаю, что это тупик. Извините, что ответ так поздно, что я не получил уведомление по электронной почте. –

+0

Добавление «SubmitChanges» - ужасная идея здесь (крайне неинтуитивная с непредсказуемыми побочными эффектами). Я превращу свой -1 в +1 без него. –

+0

Я только что понял, что вы ответили на вопрос название отлично - большой ответ глупый вопрос. Я редактировал свой вопрос, но что такое протокол? –

0

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

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

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

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

+0

Я протестировал это, и он работает нормально. Мое первое использование было для таблицы поиска. Теперь я могу делать такие вещи, как db.LookupsHelper.GetDropDownValues ​​(«User.Type»); вместо - от l в db.lookups, где атрибут == "User.Type" выбирает новый {l.lookupid, l.displaytext} –