1

ADO.NETデータテーブルに挿入したいLinq式があります。データテーブル名を設定するために、クエリのフィールド名を知りたいのですが。これが私のコードの例です:

var result=from item in context.table
           select new{
                field1=... ,
                field2=... ,
                field3=...
           };

私がやりたいのは、テーブル名を設定することです。

Datatable.Columns.Add("field1"); .. etc

私はそれを手動でやろうとしましたが、それに対するエレガントな解決策があるはずだと思います。

ありがとう

4

4 に答える 4

4

私のおすすめ:

var result=from item in context.table
           select new{
                field1=... ,
                field2=... ,
                field3=...
           };

static IEnumerable<string> GetPropertyNames<T>(IEnumberable<T> lst) 
{
  foreach (var pi in typeof(T).GetProperties())
  {
    yield return pi.Name;
  }
}

var propnames = GetPropertyNames(result);
于 2012-05-03T11:01:18.190 に答える
3

リフレクションを利用することで、LINQ式で作成された匿名型のプロパティの名前を抽出できます。

var result = from item in context.table
    select new {
         field1 = ... ,
         field2 = ... ,
         field3 = ... };

if (result.Any())
{
    Type t = result.First().GetType();
    foreach (PropertyInfo p in t.GetProperties())
    {
        // Get the name of the prperty
        Console.WriteLine(p.Name);
    }
}
于 2012-05-03T10:18:05.183 に答える
3

これは少し簡単かもしれません;)..。

var fieldNames = (from p in query.GetType().GetProperties() select p.Name).ToArray();
于 2015-04-28T07:51:06.477 に答える
2

匿名タイプを作成するのでselect new、私が知っている短いエレガントなソリューションはありませんが、あなたはあなたが望むことをすることができます。ここでの考え方は、クエリによって返された最初のアイテムを取得し、匿名タイプのタイプ情報を使用して、そのプロパティを反映し、を埋めることができるということDataTableです。

これは、匿名タイプDataTableの情報を取得する次のメソッドを使用して実行できます。Type

public static void FillColumns(DataTable table, Type anonymousType) {
    PropertyInfo[] properties = anonymousType.GetProperties();

    foreach (PropertyInfo property in properties) {
        table.Columns.Add(property.Name);
    }
}

次に、たとえば、このようなことを行うことができます

var result = from item in context.Table
            select new {
                field1 = item.f1,
                field2 = item.f2,
                field3 = item.f3
            };

if (result.Count() != 0) {
    DataTable table = new DataTable("Table");
    FillColumns(table, result.First().GetType());
}

DataTableこの短い例では、3つの列、、、およびがfield1生成されます。編集すでに時間を費やしているので、完全な実例を投稿するのもよいでしょう。field2field3

namespace ConsoleApplication1
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.Reflection;

    #region Fake Database

    internal class DatabaseMock
    {
        private DatabaseMock() { 
            // Hides the default public constructor created by the compiler
            // Uses the factory pattern for creation instead
        }

        /// <summary>
        /// Creates a new instance of a database with three default items
        /// </summary>
        public static DatabaseMock Create() {
            DatabaseMock database = new DatabaseMock();

            List<ItemMock> items = new List<ItemMock>();
            items.Add(new ItemMock("item1"));
            items.Add(new ItemMock("item2"));
            items.Add(new ItemMock("item3"));

            database.Table = items;

            return database;
        }

        /// <summary>
        /// Gets the items in the database
        /// </summary>
        public IEnumerable<ItemMock> Table {
            get;
            private set;
        }
    }

    internal struct ItemMock
    {
        /// <summary>
        /// Initializes a new instance of the ItemMock class
        /// </summary>
        public ItemMock(string value) {
            _value = value;
        }

        private string _value;
        /// <summary>
        /// Gets the items value
        /// </summary>
        public string Value {
            get {
                return _value;
            }
        }
    }

    #endregion

    static class Program
    {
        /// <summary>
        /// Takes the specified DataTable and anonymous type information, and populates the table with a new DataColumn per anonymous type property
        /// </summary>
        public static void FillColumns(DataTable table, Type anonymousType) {
            PropertyInfo[] properties = anonymousType.GetProperties();

            foreach (PropertyInfo property in properties) {
                table.Columns.Add(property.Name);
            }
        }

        static void Main() {
            DatabaseMock database = DatabaseMock.Create();

            var query =
                from item in database.Table
                select new {
                    field1 = item.Value,
                    field2 = item.Value,
                    field3 = item.Value
                };

            if (query.Count() != 0) {
                DataTable table = new DataTable("Table");
                FillColumns(table, query.First().GetType());

#if DEBUG
                foreach (DataColumn column in table.Columns) {
                    Debug.WriteLine(column.ColumnName);
                }
#endif
            }
        }
    }
}
于 2012-05-03T10:31:50.340 に答える