动态linq到Dataset数据行,基于集合属性名称

时间:2012-02-09 00:19:27

标签: c# linq collections

我正在开发一个连接到Oracle的项目。它通过数据集返回数据。我使用Linq将它绑定到一个集合并将其抛回以供json读取。它运作良好,但我不禁想 - 必须有一个更好的方法来做到这一点。这是我做的一个例子。我希望它能帮助别人。 Dsp是Dataset。

List<Information> lstSearch = null;
     lstSearch = (from l in dsp.Tables[0].AsEnumerable()

                         select new Information
                         {

                             application_id = l["APPLICATION_ID"].ToString(),
                             hospital_name_1 = l["HOSPITAL_NAME_"].ToString(),
                             physical_address = l["PHYSICAL_ADDRESS"].ToString(),
                             // may have to add more here...

                         }).ToList<Information>();

// serialize and send back as a json string
System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
                    new System.Web.Script.Serialization.JavaScriptSerializer();

                string sJSON = oSerializer.Serialize(lstSearch.First());

理论上,是的有效。 “information”集合与页面上每个控件的html“name”标记匹配,提供了一个很好的健壮绑定。我担心的是 遍历每个字段名称以填充List&lt;&gt;对象

集合(get / set)属性与数据集列名称匹配时是否存在特定的where子句,因此仅当列名称(而不是值)与数据行列匹配时才填充集合?

1 个答案:

答案 0 :(得分:1)

我建议AutoMapper ...请参阅this question

这是一个非常简单的例子。确保您的.NET类型完全镜像数据库对象的结构,否则AutoMapper将无法像宣传的那样工作:

namespace EnumerableDT
{
    class Program
    {
        public class Information
        {
            public int APPLICATION_ID { get; set; }
            public string HOSPITAL_NAME { get; set; }
            public string PHYSICAL_ADDRESS { get; set; }
            public string SOME_OTHER_FIELD { get; set; }
        }

        static DataSet dsp = new DataSet();

        static void Main(string[] args)
        {
            dsp.Tables.Add(BuildDataTableStructure());
            dsp.Tables[0].Rows.Add(BuildRow());

            AutoMapper.Mapper.Reset();
            AutoMapper.Mapper.CreateMap<IDataReader, Information>();

            var il = AutoMapper.Mapper.Map<IDataReader, IList<Information>>(dsp.Tables[0].CreateDataReader());

            Console.ReadLine();
        }

        static DataTable BuildDataTableStructure()
        {
            var dt = new DataTable();
            var dc = new DataColumn("APPLICATION_ID", typeof(int));
            dt.Columns.Add(dc);
            dc = new DataColumn("HOSPITAL_NAME", typeof(string));
            dt.Columns.Add(dc);
            dc = new DataColumn("PHYSICAL_ADDRESS", typeof(string));
            dt.Columns.Add(dc);
            dc = new DataColumn("SOME_OTHER_FIELD", typeof(string));
            dt.Columns.Add(dc);

            return dt;
        }

        static DataRow BuildRow()
        {
            DataRow dr = dsp.Tables[0].NewRow();
            dr["APPLICATION_ID"] = 1;
            dr["HOSPITAL_NAME"] = "The Hospital";
            dr["PHYSICAL_ADDRESS"] = "123 Main St.";
            dr["SOME_OTHER_FIELD"] = "Some Other Data";

            return dr;
        }
    }
}