【问题标题】:c# LINQ) how to delete rows which match a List and specific value in a DataTable?c# LINQ) 如何删除与列表和数据表中的特定值匹配的行?
【发布时间】:2017-04-04 12:22:21
【问题描述】:

我有 DataTable 的数据如下,

Couponid       STATE

20160406000033     A  
20160406000051     A     <--- I don't want this row
20160406000051     K   
20160406000051     K  

我有一个列表 list_coupon,其中包括 20160406000051。

现在,我只想复制整个 DataTable,不包括与 List list_coupon 匹配且同时具有“A”值的行。 如果 Couponid 与列表匹配且值为 'K',则必须保留在 DataTable 中。

换一种说法,

在处理每一行时,

如果某行不属于列表,则该行必须保留在 DataTable 中。

但是,如果一行属于列表,并且该行具有“A”值,则必须排除该行,但属于该列表的具有“K”值的其他行必须保留在 DataTable 中。

我通过使用几个循环来做到这一点,但它花费了太多时间..

我认为下面我尝试的代码将 DataTable 划分为行是否属于列表,而我也需要“既属于又不属于”列表的行..

IEnumerable<DataRow> rows_query = from r in dt.AsEnumerable()
                                  where !list_coupon.Contains(r.Field<string>("Couponid")) &&
                                  r.Field<string>("STATE") != "A"
                                  select r;

dt = rows_query.CopyToDataTable();

我们将非常感谢您的出色建议!

非常感谢!

【问题讨论】:

  • 如果答案对您有用,请接受答案。
  • @Viplock,有些奇怪……我正在分析……请稍候

标签: c# linq list datatable


【解决方案1】:

只需将查询更改为

  IEnumerable<DataRow> rows_query = from r in dt.AsEnumerable()
                              where !(list_coupon.Contains(r.Field<string>("Couponid")) &&
                              r.Field<string>("STATE") == "A")
                              select r;

  dt = rows_query.CopyToDataTable();

将 not 运算符排除在两者之外,它会顺利运行。

希望对你有帮助。

【讨论】:

  • 我还想对您的出色知识表示深深的感谢。请理解这两个答案都是正确的,但另一个答案是之前提供的..
  • 此外,您能否提供 SQL 语句,如果属于列表且值为“A”,则删除行的含义相同?
  • 很好,我不是要求接受我的回答。我要求接受任何正确并让您满意的答案。 :)
【解决方案2】:

所以根据您的解释,我了解到您希望不在列表中的每一行 OR 都在列表中,但其值与 A 不同。

你需要在linq中使用or运算符||

IEnumerable<DataRow> rows_query = from r in dt.AsEnumerable()
                                  where !list_coupon.Contains(r.Field<string>("Couponid")) || 
                                  (list_coupon.Contains(r.Field<string>("Couponid")) &&
                                     r.Field<string>("STATE") != "A")
                                  select r;

if(rows_query.Any())
    dt = rows_query.CopyToDataTable();

最好检查是否有任何行,因为如果 linq 没有返回任何行,CopyToDataTable() 将抛出异常。

【讨论】:

  • 非常感谢您分享您的出色知识!它工作正常!
  • 此外,您能否提供 SQL 语句,如果属于列表且值为“A”,则删除行的含义相同?
  • @KayLee 堆栈溢出的政策是每个帖子问一个问题。问另一个人,有人会回答你。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 2016-12-31
  • 2015-02-20
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多