【问题标题】:Bind a grid to an anonymous LINQ result, then commit changes to DB?将网格绑定到匿名 LINQ 结果,然后将更改提交到 DB?
【发布时间】:2011-03-04 06:04:25
【问题描述】:

我一直在研究如何最好地做到这一点,我们将不胜感激。出于只读目的,我一直很高兴地使用 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。这似乎仍然针对明确设计的类,即使该类只有字段的一个子集。

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    在这里进行疯狂的猜测,但您不能听 LINQDataSource.Updating 事件并在那里执行您的保存吗?当然,由于您无法在LinqDataSourceUpdateEventArgs.OriginalObject 中键入object,因此映射会有一些问题。

    如果您创建 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

    【讨论】:

    • 谢谢。哎呀!现在我看到你的答案并思考更多,我想它不必是匿名的,我想我可以定义一个包含两者内容的类型。可能会将这个想法添加到问题中!
    • 嗨迈克,我真的没有能力支付账单来编写你提到的内容,但如果我没有听到任何其他建议,我会将其标记为答案很快! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多