根据列表过滤来自Datatable的记录

时间:2014-03-04 13:46:47

标签: c# linq datatable

我有一个班级:

public class Cards
{ 
   private string _type= string.Empty;
   private string _name= string.Empty;

   public string Type
   {
       get { return _type; }
       set { _type= value; }
    }

public string Name
{
    get { return _name; }
    set { _name= value; }
} 
}

我有这个班级的对象。

public List<Cards> CardTypes = new List<Cards>();

列表卡中的值为:

Name     Type
==============
Visa          Vi

Master        MA

Discover      DI

我有一个DataTable cardTable,其中包含以下列:

名称,值CCvName

+---+------------+-------------+
|Val|  Name      |    CCV      |
+---+------------+-------------+
| 1 | Visa       |   441       |
| 2 | Master     |   121       |
| 3 | Amex       |   111       |
| 4 | Diners     |   222       |
+---+------------+-------------+

List和DataTable都具有唯一值。我想根据List中的Name字段过滤数据表中的数据(从cardTable中删除其他记录)。所有值都是字符串类型。

生成的cardTable应为:

+---+------------+-------------+
|Val|  Name      |    CCV      |
+---+------------+-------------+
| 1 | Visa       |   441       |
| 2 | Master     |   121       |
+---+------------+-------------+

提前致谢。

2 个答案:

答案 0 :(得分:2)

一种简单的方法是使用RowFilterDataView的新DataViewDataTable的默认cardTable

给定cardTypesvar view = new DataView(cardTable) { // create filter: [Name] IN ('Visa','Master','Discover') RowFilter = String.Format("[Name] IN ({0})", String.Join(",", cardTypes.Select(t => "'" + t.Name + "'"))) };

view

Join现在包含您要查找的行。


如果您真的需要LINQ解决方案,可以使用简单的cardTable = cardTable.AsEnumerable() .Join(cardTypes, i => i.Field<string>("Name"), o => o.Name, (i, o) => i) .CopyToDataTable();

{{1}}

答案 1 :(得分:0)

您可以在列表中编写没有相应卡类型的LINQ连接查询返回行:

var rowsToDelete = from r in cardTable.AsEnumerable()
                   join c in CardTypes 
                        on r.Field<string>("Name") equals c.Name into g
                   where !g.Any()
                   select r;

然后删除这些行:

foreach(var row in rowsToDelete)
    cardTable.Rows.Remove(row);