我一直在研究如何做到最好,智慧将受到赞赏。出于只读目的,我一直很高兴使用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类型操作),或者只是一种简单的方法来“显示”另一个表中的字段而不涉及它们在更新?
编辑:更多的是,它确实 无法匿名。我很乐意定义一个类来包含该查询中的元素,因为它不会经常更改。但是,这些元素将跨越两个表,即使只有一个表需要更新。不确定这是否表明实体框架会更合适 - 我觉得它不会 - 我不希望整个'模型'总是以这种方式对字段进行分组。
谢谢!
答案 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