查找List <customclass> </customclass>中不存在于datatable中的项目

时间:2013-11-06 09:58:05

标签: c# .net vb.net linq

我试图通过跨越IEnumerable Datarow和自定义类之间的公共字段来找到获取对象列表的方法。

我加载数据集并使用DataSetExtensions程序集将其转换为IEnumerable Datarow()

  Dim listaRows = ds.Tables(0).AsEnumerable().Cast(Of DataRow).ToList()

然后我有一个自定义类的列表,其中包含了可用于跨越数据行字段的对象。

基本上,自定义类有一个名为ParsedFileName的proeprty,这个项目存在 在属性名为Filename的数据行中。

我需要找出创建一个linq查询的方法,该查询使用元素(基于文件名字段)查找列表中不存在于Ienumerable Datarow中的信息。

我不能使用List<T>.Except,因为它接收的参数是同一类的第二个Ienumerable集合。

我试图考虑查询怎么样,但我只是设法得到这样的东西,而且它无效,因为它使用等于除了。

我正在尝试这样的事情:

 Dim list As List(Of sftpClass.SftpObj) = _
                listaFichero.Select(Function(l) Not l.FicheroParsed. _
                            Equals(listaRows.Select(Function(r) _
                                                        r.Field(Of String)("FICHERO")))).ToList

3 个答案:

答案 0 :(得分:0)

将它们作为字符串进行比较怎么样?

customClassCollection.SelectMany(x=>x.ParsedFileName).Except(dataRows.AsEnumerable().Select(row => row.Field<string>("FieldName")));

答案 1 :(得分:0)

好的,我终于使用HashSet获得了它:

Dim listaRows = ds.Tables(0).AsEnumerable(). _
                Cast(Of DataRow).ToList()

Dim valores = New HashSet(Of String) _
                          (listaRows.Select(Function(r) r.Field(Of String)("FICHERO")))

Dim query = _
                listaFichero.Where(Function(l) _
                                       Not valores.Contains(l.FicheroParsed)).ToList

答案 2 :(得分:0)

我不确定天气我完全理解你的问题,但是如果你想在linq,数据行和自定义类之间进行协作,你可以按照以下方式进行:

首先使您的数据表成为IEnumearable。 实际上,LINQ查询适用于实现IEnumerable / IQueryable接口的数据源。但DataTable没有实现任何这些。所以我们不能直接在DataTable上应用LINQ查询。

使用名为AsEnumerable的DataTable类的扩展方法返回一个IEnumerable DataRow集合。在DataTable上使用AsEnumerable函数,然后在生成的集合上使用一些LINQ。

List<CustomClass> cList= new List<CustomClass>();
if(dtTable.row.count>0){
cList=( from p in dtTable.AsEnumerable()
        select new CustomClass{
        propObj1= p.Field<OfType>("DatatableColumnName"),
        propObj2=p.FIeld<ofType>("DatabaseTableColumnName2")
}).ToList();
}

希望这会有所帮助 问候, 鲁贝尔