c# - 将网格绑定(bind)到匿名 LINQ 结果,然后将更改提交到数据库?

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

我一直在研究如何最好地做到这一点,我将不胜感激。出于只读目的,我一直很高兴地使用 LINQ 并将其绑定(bind)到网格。出于编辑目的,我使用了 LinqDataSource 控件,在此过程中启用了编辑/删除操作,并且我有一个很好的可编辑网格绑定(bind)到表的部分或全部字段。

现在我想编辑表 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。这似乎仍然针对明确设计的类,即使该类只有字段的子集。

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

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

谢谢!

最佳答案

在这里大胆猜测,但您不能听取 LINQDataSource.Updating 事件并在那里执行保存吗?当然,您会遇到一些映射问题,因为您不能在 LinqDataSourceUpdateEventArgs.OriginalObject 中键入 object

如果您创建一个 ViewModel 而不是匿名类型会怎么样。类似于 DupeVoucherViewModel

然后在 Updating 事件中,您可以将 LinqDataSourceUpdateEventArgs.OriginalObject 转换为 DupeVoucherViewModel 对象并开始映射和保存数据。

示例

鉴于您创建了一个 View 模型(一个类),您调用 DupeVoucherViewModel 并像这样绑定(bind)到它:

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

关于c# - 将网格绑定(bind)到匿名 LINQ 结果,然后将更改提交到数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5190294/

相关文章:

c# - 如何使用 OpenXML C# 在 PowerPoint 中插入新的 SmartArt

c# - 具有主机级别信任的 LINQ 反射

c# - HttpWebResponse.StatusCode 未捕获 500 错误

javascript - ASP.NET MVC 中的按钮提交

c# - 如何识别从其他地方返回我的 ASP.NET MVC 站点的用户?

c# - 在没有 Foreach 循环的情况下访问 LINQ 结果中的行?

c# - Linq Exception 表达式必须是 MemberExpression

c# - 如何合并两个或多个实现相同接口(interface)的列表

c# - 如何根据 g-score 修正路径?

c# - 来自数据库的 varbinary pdf 已崩溃?