如何在数据表中获取FirstOrDefault添加/更新/删除的数据行?

时间:2016-09-12 20:15:51

标签: c# linq dataset datarow epicorerp

我正在开发我的Epicor ERP在BPM的前/后处理中调用的外部.dll。 .dll是用C#编写的,Epicor传递.dll数据集。

我看过代码示例要么更改了行,要么是FirstOrDefault而不是两者都有。

此代码始终为null,因此我的做法永远不会被调用。

var ttQuoteDtl = ds.QuoteDtl.Where(r => r.RowMod == IceRow.ROWSTATE_ADDED || r.RowMod == IceRow.ROWSTATE_UPDATED || r.RowMod == IceRow.ROWSTATE_DELETED);

var ttQuoteDtl_xRow = (from ttQuoteDtl_Row in ttQuoteDtl select ttQuoteDtl_Row).FirstOrDefault(); 

if (ttQuoteDtl_xRow != null)
{
  //Do Something 
}

如果我这样调用它,我可以让ttQuoteDtl不为null并执行一些工作:

var ttQuoteDtl_xRow = ds.QuoteDtl.FirstOrDefault();

但我担心它不会成为已添加,更新或删除的行。

1 个答案:

答案 0 :(得分:1)

你可以将两者结合起来,Linq语句是可组合的。

var quoteDtlRow = 
    ds.QuoteDtl
    .Where(r => 
        r.RowMod == IceRow.ROWSTATE_ADDED || 
        r.RowMod == IceRow.ROWSTATE_UPDATED || 
        r.RowMod == IceRow.ROWSTATE_DELETED
    ).FirstOrDefault();

如果这始终为null,那么我们可能需要查看更多代码。

顺便提一下,如果DS是传递给BPM方法的数据集,那么来自ds.QuoteDetail的行会实现IceRow接口。这提供了方法.Added().Updated().Deleted().Unchanged(),意味着上述内容可以缩短为

var quoteDtlRow = 
    ds.QuoteDtl
    .Where(
        r => !r.Unchanged()
    ).FirstOrDefault();