gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:42:55 25 4
gpt4 key购买 nike

我一直在研究如何最好地做到这一点,我将不胜感激。出于只读目的,我一直很高兴地使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com