Динамический linq to Dataset datarow на основе имени свойства коллекции - PullRequest
2 голосов
/ 09 февраля 2012

Я работаю над проектом, который подключается к Oracle.Возвращает данные через набор данных.Я использую Linq, чтобы связать его с коллекцией и вернуть обратно для чтения json.Это прекрасно работает, но я не могу не думать - должен быть лучший способ сделать это.Вот пример того, что я делаю.Я надеюсь, что это помогает другим.Dsp - это набор данных.

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 <>.

Нет конкретного условия where, в котором свойство collection (get / set) соответствует имени столбца набора данныхзаполняя таким образом коллекцию, только если имя столбца (не значение) соответствует столбцу строки данных?

1 Ответ

1 голос
/ 09 февраля 2012

Я бы порекомендовал AutoMapper ... см. этот вопрос .

Вот очень простой пример. Убедитесь, что ваш тип .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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...