Привязать сетку к анонимному результату LINQ, а затем зафиксировать изменения в БД? - PullRequest
3 голосов
/ 04 марта 2011

Я искал, как лучше всего это сделать, и мудрость была бы оценена.Для целей только для чтения, я счастливо использовал LINQ и привязал его к сетке.В целях редактирования я использовал элемент управления LinqDataSource, включил в процесс операции редактирования / удаления, и у меня есть хорошая редактируемая сетка, привязанная к некоторым или всем полям таблицы.

Теперь у меня есть ситуациягде я хочу отредактировать несколько полей в таблице A, но в связанной таблице B есть различные значения, которые я также хочу отобразить в этой сетке (их редактирование не требуется).Так что мой запрос выглядит следующим образом.Поля в tblDupes (очищенные, заметки) - это то, что я хочу отредактировать, но я хотел бы отобразить эти поля tblVoucher.

var theDupes = from d in db.tblDupes
                           where d.dupeGroup == Ref
                           select new
                           {
                               Ref = d.dupeGroup,
                               InvoiceNum = d.tblVoucher.invoiceRef,
                               Value = d.tblVoucher.invoiceAmtDecimal,
                               VendorNum = d.tblVoucher.vendorID,
                               VendorName = d.tblVoucher.vendorName,
                               Cleared = d.Cleared
                               Notes = d.Notes
                           };

Аналогичный, но другой вопрос LINQDataSource - Запрос нескольких таблиц? послал меня, просматривая запись в блоге Скотта Гатри http://weblogs.asp.net/scottgu/archive/2007/09/07/linq-to-sql-part-9-using-a-custom-linq-expression-with-the-lt-asp-linqdatasource-gt-control.aspx,, где он обрабатывает различные события, чтобы получить LinqDataSource с пользовательским запросом к таблицам.Это все еще кажется нацеленным на явно разработанные классы, даже если у класса есть только подмножество полей.

Итак, мой вопрос: есть ли простой способ разрешить фиксацию изменений, внесенных в анонимную коллекцию (действие типа changes.Submit), или просто простой способ «отображать» поля из другой таблицы, покане вовлекаете их в обновление?

РЕДАКТИРОВАТЬ: Думая больше, не имеет , чтобы быть действительно анонимнымЯ был бы рад определить класс, который будет содержать элементы в этом запросе, поскольку он не будет часто меняться.Но эти элементы будут присутствовать в двух таблицах, хотя только одна нуждается в обновлении.Не уверен, что это предполагает, что структура сущностей будет более подходящей - у меня такое ощущение, что это не так - я не хочу, чтобы вся «модель» всегда группировала поля таким образом.

Спасибо!

1 Ответ

0 голосов
/ 04 марта 2011

Здесь можно сделать предположение, но не могли бы вы прослушать событие LINQDataSource.Updating и выполнить сохранение там?Конечно, у вас могут возникнуть проблемы с отображением, поскольку вы не можете набрать object в LinqDataSourceUpdateEventArgs.OriginalObject.

Что если вы создадите ViewModel вместо анонимного типа.Что-то вроде DupeVoucherViewModel.

Затем в событии Updating вы можете привести LinqDataSourceUpdateEventArgs.OriginalObject к объекту DupeVoucherViewModel и начать отображение и сохранение ваших данных.

Пример

Учитывая, что вы создаете модель представления (класс), которую вы называете DupeVoucherViewModel и привязываетесь к ней следующим образом:

var theDupes = from d in db.tblDupes
                       where d.dupeGroup == Ref
                       select new DupeVoucherViewModel
                       {
                           Ref = d.dupeGroup,
                           InvoiceNum = d.tblVoucher.invoiceRef,
                           Value = d.tblVoucher.invoiceAmtDecimal,
                           VendorNum = d.tblVoucher.vendorID,
                           VendorName = d.tblVoucher.vendorName,
                           Cleared = d.Cleared
                           Notes = d.Notes
                       };

Тогда тег сервера должен отобразить событие обновления следующим образом:

<asp:LinqDataSource EnableUpdate="true" OnUpdating="LinqDataSource_Updating" />

И код должен содержать следующий метод:

protected void LinqDataSource_Updating(object sender, LinqDataSourceUpdateEventArgs e)
{
   // originalObject contains the unchanged object
   var originalObject = (DupeVoucherViewModel)e.OriginalObject;
   // newObject contains the changed object
   var newObject = (DupeVoucherViewModel)e.NewObject;

   // Perform your save using newObject
   yourDataAccessComponent.SaveSomething(newObject);
}

Возможно, вам потребуется включить в DupeVoucherViewModel дополнительную информацию, такую ​​как идентификатор tblDupes или что-то подобное, так чточто вы можете загрузить это и изменить его.

Вы можете узнать больше о LinqDataSource здесь: http://msdn.microsoft.com/en-us/library/bb514963.aspx

...