将网格绑定到匿名LINQ结果,然后将更改提交到DB?

时间:2011-03-04 06:04:26

标签: c# asp.net linq linq-to-sql anonymous-types

我一直在研究如何做到最好,智慧将受到赞赏。出于只读目的,我一直很高兴使用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?让我看到scott Guthrie的博客条目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具有跨表的自定义查询。尽管这个类只有一个字段的子集,但这似乎仍然针对明确设计的类。

所以我的问题是:是否有一种简单的方法可以允许提交对匿名集合所做的更改(change.Submit类型操作),或者只是一种简单的方法来“显示”另一个表中的字段而不涉及它们在更新?

编辑:更多的是,它确实 无法匿名。我很乐意定义一个类来包含该查询中的元素,因为它不会经常更改。但是,这些元素将跨越两个表,即使只有一个表需要更新。不确定这是否表明实体框架会更合适 - 我觉得它不会 - 我不希望整个'模型'总是以这种方式对字段进行分组。

谢谢!

1 个答案:

答案 0 :(得分:0)

在这里猜测,但你不能听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的ID或其他内容,以便您可以加载并更改它。

您可以在此处详细了解LinqDataSource:http://msdn.microsoft.com/en-us/library/bb514963.aspx