2

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

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

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

然后我有一个自定义类列表,其中加载了我可以用来跨数据行字段的对象。

基本上,自定义类有一个名为的ParsedFileName属性,并且此项目存在于具有属性 name 的数据行中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
4

3 回答 3

0

我不确定天气我是否已完全理解您的问题,但如果您想在 linq、数据行和自定义类之间进行协作,您可以执行以下操作:

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

使用名为 AsEnumerable 的 DataTable 类的扩展方法返回 DataRow 的 IEnumerable 集合。在 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();
}

希望这有助于问候,鲁贝尔

于 2013-11-06T10:50:57.537 回答
0

将它们作为字符串进行比较呢?

customClassCollection.SelectMany(x=>x.ParsedFileName).Except(dataRows.AsEnumerable().Select(row => row.Field<string>("FieldName")));
于 2013-11-06T10:03:45.867 回答
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
于 2013-11-06T10:34:30.423 回答