【问题标题】:How to apply DataRowVersion.Original to Lambda?如何将 DataRowVersion.Original 应用于 Lambda?
【发布时间】:2017-07-19 03:31:49
【问题描述】:
UltraGrid dgSomeGrid = new UltraGrid();


if (((someDS.someDT)dgSomeGrid.DataSource).Any(x => x.ColumnA == someCode))
{

}

上面的代码抛出异常,因为其中一行被删除,与之前发布的类似问题:Error: Deleted row information cannot be accessed through the row

根据答案,解决方案可以检查 rowVersion 所以我想知道如何将DataRowVersion.Original 应用于上述Lambda 表达式而不是循环?

【问题讨论】:

  • 你试过...Any(x => x["ColumnA",DataRowVersion.Original]==someCode))
  • @Pikoh Possible unintended reference comparison; to get a value comparison, cast the left hand side to type string ?
  • 试过但没有运气....Any(x => Convert.ToString(x["ColumnA", DataRowVersion.Original].ToString()) == someCode)
  • 这段代码会发生什么?

标签: c# lambda


【解决方案1】:

要访问DataRowVersion,您必须访问DataRow 集合。所以这段代码应该这样做:

if (((someDS.someDT)dgSomeGrid.DataSource)
                      .Any(x => x["ColumnA",DataRowVersion.Original].ToString()==someCode))

但是您必须小心,因为如果没有 DataRow 版本(即在此代码之前有一个 AcceptChanges()),这将引发异常,因此您宁愿检查它:

DataTable dt=(someDS.someDT)dgSomeGrid.DataSource
bool r;
if (dt.AsEnumerable().Any(x => x.HasVersion(DataRowVersion.Original)))
{
    r = dt.AsEnumerable().Any(x => x["Column1", DataRowVersion.Original].ToString()==someCode);
}
else
{
    r = dt.AsEnumerable().Any(x => x["Column1"].ToString()==someCode);
}

编辑

顺便说一句,我认为更好的解决方案是在查询之前只使用AcceptChanges(),因为搜索已删除的值几乎没有意义。

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 2011-05-06
    • 1970-01-01
    • 2015-11-08
    • 2019-01-02
    • 1970-01-01
    • 2017-08-13
    • 2019-01-15
    相关资源
    最近更新 更多