Анонимные типы в LINQ

#linq #anonymous-types

#linq #анонимные типы

Вопрос:

Я использую следующий код для получения записи из таблицы моей базы данных tblDatabases . Затем я заполняю элементы управления в форме на основе значения. Я использовал некоторые функции, чтобы получить значения, необходимые для отображения в текстовом поле (например, отображаемое значение отличается от значения.

DetailData — это объект в моем базовом классе form. Изначально я просто получил запись из таблицы как есть, и я смог привести DetailData к tblDatabases и использовать отражение, чтобы получить все значения для данных и заполнить элементы управления в моей форме.

Я больше не могу привести DetailData к моей таблице из-за анонимных типов.

Я хотел бы иметь возможность использовать отражение DetailData для получения значений.

Спасибо, Брэд

   DetailData = (from db in priorityDataContext.tblDatabases
      where db.DatabaseID == Id
      select new
        {
            db.DatabaseID,
            db.DatabaseName,
            db.Purpose,
            db.BackEnd,
            db.FrontEnd,
            db.Version,
            db.ProducesReports,
            db.MultiUser,
            db.UserDescription,
            Developer = priorityDataContext.func_get_employee_name(db.Developer),
            DeptOwner = priorityDataContext.func_get_dept_name(db.DeptOwner),
            db.Source_Code_Path,
            db.Notes,
            db.Active,
            db.row_entry_time_stamp,
            row_oper_name = priorityDataContext.func_get_employee_name(db.Developer),
            db.row_last_chng_time_stamp,
            row_last_chng_oper_name = priorityDataContext.func_get_employee_name(db.Developer)
        }).SingleOrDefault();


protected virtual void PopulateDetailControlsA(List<Control> controlContainers, string srcDataTableName)
{
    switch (srcDataTableName)
    {
        case "tblDatabase" :
            break;
    }

    var database = (tblDatabase) DetailData;
    var type = typeof(tblDatabase);
    var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

    foreach (var controlContainer in controlContainers)
    {
        foreach (var propertyInfo in properties)
        {
            if (!ControlExists(controlContainer, propertyInfo.Name)) continue;

            var txtExtControl = controlContainer.Controls[propertyInfo.Name] as ExtendedTextBox;
            if (txtExtControl != null)
            {
                try
                {
                    var value = propertyInfo.GetValue(database, null).ToString();

                    txtExtControl.Text = value;
                }
                catch (NullReferenceException)
                {
                }
                continue;
            }

            var lnklblControl = controlContainer.Controls[propertyInfo.Name] as ExtendedLinkLabel;
            if (lnklblControl != null)
            {
                try
                {
                    var value = propertyInfo.GetValue(database, null).ToString();

                    lnklblControl.Text = value;
                }
                catch (NullReferenceException)
                {
                }
                continue;
            }

            var chkControl = controlContainer.Controls[propertyInfo.Name] as ExtendedCheckBox;
            if (chkControl != null)
            {
                try
                {
                    var value = propertyInfo.GetValue(database, null).ToString();

                    switch (value)
                    {
                        case "True":
                            chkControl.CheckState = CheckState.Checked;
                            break;
                        case "False":
                            chkControl.CheckState = CheckState.Unchecked;
                            break;
                    }
                }
                catch (NullReferenceException)
                {
                    chkControl.CheckState = CheckState.Indeterminate;
                }
                continue;
            }

            var cmbControl = controlContainer.Controls[propertyInfo.Name] as ExtendedComboBox;
            if (cmbControl != null)
            {
                try
                {
                    var value = propertyInfo.GetValue(database, null).ToString();

                    cmbControl.ValueMember = value;
                }
                catch (Exception ex)
                {
                }
                continue;
            }
        }
    }
}
  

Комментарии:

1. Было бы полезно, если бы вы могли опубликовать минимальное количество кода, необходимое для воспроизведения вашей проблемы. Прямо сейчас довольно сложно понять, что происходит.

Ответ №1:

Какую технологию вы используете для своего пользовательского интерфейса? Если бы вы могли использовать привязку, вам не нужно было бы беспокоиться об отражении анонимного типа, а затем вы также могли бы использовать конвертеры, если вам нужно отформатировать / вычислить значения из этого.

Из вашего ответа следует, что вы не можете просто использовать подключение к linq, а затем привязать это к полю со списком?

     private void Form1_Load(object sender, System.EventArgs e)
    {
        var item = new DataClassesDataContext();
        var stuff = item.Entity.Where(c => c.Property.Contains("something"));
        comboBox1.DataSource = stuff;
        comboBox1.DisplayMember = "Name";
        comboBox1.ValueMember = "PIN";
    }
  

Комментарии:

1. Это существующее приложение Winforms. Я пытался отключить команды sql и использовать linq. Мы отображаем такие вещи, как имя оператора, на основе PIN-кода пользователя. Итак, в настоящее время инструкция sql включает функцию, которая получает имя пользователя из PIN-кода. Таким образом, элементом значения поля со списком является PIN-код пользователя, а отображаемым значением — имя пользователя.