我试图通过跨越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
答案 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();
}
希望这会有所帮助 问候, 鲁贝尔