Привязать сетку к анонимному результату LINQ, а затем зафиксировать изменения в БД?

Я искал, как лучше всего это сделать, и я был бы признателен за мудрость. Только для чтения я с радостью использую 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 - Query Multiple Tables? отправил мне посмотреть запись в блоге Скотта Гатри 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), или просто простой способ `` отобразить '' поля из другой таблицы, не вовлекая их в обновление ?

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

Спасибо!


person Glinkot    schedule 04.03.2011    source источник


Ответы (1)


Не могли бы вы послушать событие 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

person Mikael Östberg    schedule 04.03.2011
comment
Спасибо за это. Господи! Теперь я вижу ваш ответ и думаю больше. Думаю, он не обязательно должен быть анонимным. Думаю, я мог бы определить тип, в котором есть их содержимое. Могу добавить эту мысль к вопросу! - person Glinkot; 05.03.2011
comment
Привет, Майк, у меня действительно нет навыков, чтобы оплачивать счета, чтобы кодировать то, что вы упомянули, но я отмечу это как ответ, если в ближайшее время не услышу других предложений! :) - person Glinkot; 08.03.2011