0

私はこのようなデータテーブルを持っています

Name| Value
----|------
NA  |  VA
NB  |  VB
NC  |  VC1
NC  |  VC2
ND  |  VD1
ND  |  VD2

そして、このようなクラス

Class NVMapping {
  List<string> NC { get; set; }
  List<string> ND { get; set; }
  string NA { get; set; }
  string NB { get; set; }
}

データテーブルをこの型に転送するためにlinqまたは他の方法を使用する方法は?

ここで 1 つのことを強調する必要があると思います。このちょっとしたマッピングは、私のアプリケーションではたくさんあります。

どういうわけか、リフレクションを使用すると、この関数を汎用にして、これらすべての種類のマッピングを処理できると思います。

したがって、可能であれば、リフレクションを使用してこれを実現するような汎用関数を使用したいと思います。

可能であれば、上記の変換のようにデータテーブルをオブジェクトに転送するだけでさらに良いでしょう。

ありがとう !

4

2 に答える 2

7

リフレクションを使用する一般的なメソッドを作成することをお勧めします。次のメソッドは、リフレクションを使用して、DataTable の DataRow (または、DataTable の各 DataRow から 1 つずつ、クラスの List<>) からクラスのパブリック プロパティを設定します。ここで、ColumnName は、クラスのパブリック プロパティの名前と正確に一致します (ケース-センシティブ)。DataTable にクラス内のプロパティと一致しない余分な列がある場合、それらは無視されます。DataTable にクラス プロパティと一致する列がない場合、そのプロパティは無視され、その型の既定値のままになります (プロパティであるため)。

    public static IList<T> DatatableToClass<T>(DataTable Table) T : クラス、new()
    {
        if (!Helper.IsValidDatatable(テーブル))
            新しい List<T>() を返します。

        タイプ classType = typeof(T);
        IList<PropertyInfo> propertyList = classType.GetProperties();

        // パラメータ クラスにはパブリック プロパティがありません。
        if (propertyList.Count == 0)
            新しい List<T>() を返します。

        List<string> columnNames = Table.Columns.Cast<DataColumn>().Select(column => column.ColumnName).ToList();

        List<T> 結果 = 新しい List<T>();
        試す
        {
            foreach (Table.Rows の DataRow 行)
            {
                T classObject = new T();
                foreach (propertyList の PropertyInfo プロパティ)
                {
                    if (property != null && property.CanWrite) // プロパティが読み取り専用でないことを確認します
                    {
                        if (columnNames.Contains(property.Name)) // プロパティが列名の場合
                        {
                            if (row[property.Name] != System.DBNull.Value) // DBNull をコピーしない
                            {
                                オブジェクト propertyValue = System.Convert.ChangeType(
                                        行[プロパティ.名前]、
                                        property.PropertyType
                                    );
                                property.SetValue(classObject, propertyValue, null);
                            }
                        }
                    }
                }
                result.Add(classObject);
            }
            結果を返します。
        }
        キャッチ
        {
            新しい List<T>() を返します。
        }
    }

逆に、クラスのパブリック プロパティから DataTable に入力することに興味がある場合は、C# ブログCSharpProgramming.tips/Class-to-DataTableで詳しく説明しています。

于 2015-01-14T15:01:15.220 に答える
3

ここにあります:

IEnumerable<DataRow> rows = table.AsEnumerable();
string naValue = null;
var naRow = rows.FirstOrDefault(r => r.Field<string>("Name") == "NA");
if(naRow != null)
    naValue = naRow.Field<string>("Value");
string nbValue = null;
var nbRow = rows.FirstOrDefault(r => r.Field<string>("Name") == "NB");
if(nbRow != null)
    nbValue = nbRow.Field<string>("Value");
NVMapping map = new NVMapping {
    NC = rows.Where(r => r.Field<string>("Name") == "NC")
        .Select(r => r.Field<string>("Value")).ToList(),
    ND = rows.Where(r => r.Field<string>("Name") == "ND")
        .Select(r => r.Field<string>("Value")).ToList(),
    NA = naValue,
    NB = nbValue
};
于 2012-11-14T16:20:29.157 に答える