【问题标题】:How can I filter a DataTable without brute-forcing it?如何过滤 DataTable 而不强制使用它?
【发布时间】:2017-01-24 19:08:40
【问题描述】:

我使用存储过程填充数据表。但是,在一个特定情况下,我需要根据结果集中的成员值的值(不是存储过程提供的参数之一)将这些结果过滤到它们通常的子集。

ISTM 认为过滤 DataTable 应该是可行的,为这个单一的场景分配它自己的一个子集。

我不知道我需要什么确切的代码,但我认为伪代码应该是这样的(“dtUsage”是一个数据表):

dtUsage = dtUsage.Rows Where MemberNo in ["0451", "050", "067"];

我可以暂时使用另一个 DataTable,并循环遍历第一个,有条件地向第二个添加行,但我确信使用 LINQ 有更优雅的方法来做到这一点。

更新

根据我看到的here,这样的事情可能会奏效:

DataRow[] result = dtUsage.Select("MemberNo IN [\"103\",\"016\",\"04501\"]");

...但是如何将结果分配给数据表?

这都不是:

dtUsage = result;

...也不是这个:

dtUsage.Rows = result;

...编译。这也不是:

DataTable dt = new DataTable();
foreach (DataRow drp in result)
{
    dt.Add(drp);
}

【问题讨论】:

  • datatable.defaultview.rowfilter
  • 回复:更新:每个数据表都带有一个隐藏在 defaultview 属性中的免费内置 DataView,它允许在不构建新查询或表的情况下进行实际过滤

标签: c# linq datatable


【解决方案1】:

我猜你可以使用这样的东西。

dtUsage = dtUsage.Where(data => data.MemberNo  == '0451' || data.MemberNo   == '050' || data.MemberNo   == '067')

编辑:或者这个?

var results = from row in dtUsage.AsEnumerable()
where (row.Field<string>("MemberNo") == "0451" ||
row.Field<string>("MemberNo") == "050" ||
row.Field<string>("MemberNo") == "067")
select row;

【讨论】:

  • dtUsage 没有可用的“位置”。
【解决方案2】:

你可能想要这样的东西:

var result = from x in dtUsage.AsEnumerable()
where new string[]{"0451", "050", "067"}.Contains(x.Field<string>("MemberNo"))
select x;

【讨论】:

  • 这逻辑不是倒过来了吗?我正在寻找包含这些值之一的 MemberNos,而在我看来,这种逻辑恰恰相反。
  • 我通常使用这种格式:List results = dtUsage.AsEnumerable().Where(x => new string[]{"0451", "050", "067"}.Contains (x.Field("MemberNo")).ToList();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2015-09-16
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多