2

IEnumerable Datarow とカスタム クラスの間の共通フィールドを交差させることで、オブジェクトのリストを取得する方法を見つけようとしました。

データセットをロードし、DataSetExtensions アセンブリを使用して IEnumerable Datarow() に変換します

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

次に、データ行フィールドを横断するために使用できるオブジェクトをロードしたカスタム クラスのリストがあります。

基本的に、カスタム クラスにはプロパティと呼ばれるParsedFileNameプロパティがあり、このアイテムはプロパティ name のデータ行に存在しますFilename

Ienumerable Datarow に存在しない要素 (ファイル名フィールドに基づく) がリストに存在することを検出する linq クエリを作成する方法を見つける必要があります。

List<T>.Except同じクラスの2番目のIenumerableコレクションである引数を受け取るため使用できません。

クエリがどのようになるかを考えようとしていましたが、このようなものしか取得できませんでした。equals not except を使用しているため、有効ではありません。

私はこのようなことを試みていました:

 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

わかりました、私は最終的に 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 に答える
0

それらを文字列として比較するのはどうですか?

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