Как получить данные «один ко многим», используя ADO .NET без платформы сущностей в приложении Web Api? - PullRequest
0 голосов
/ 22 февраля 2019

В одном приложении есть база данных "один ко многим".Модели:

 public class NewForm
{
    public int Id { get; set; }
    [Required]
    public string HeadForm { get; set; }
    [Required]
    public string DescriptionForm { get; set; }
    public virtual List<Field> Fields { get; set; }
}
 public class Field
{
    public int Id { get; set; }
    public bool Check { get; set; }
    public string HeadField { get; set; }

    public int? NewFormId { get; set; }
    public virtual NewForm NewForm { get; set; }
}

В другом приложении (Web Api) я беру данные используя sqlconnection:

        [HttpGet]
    public string GetNamesByIndex(int id)
    {
        string connectionString = @"data source = (localdb)\MSSQLLocalDB; Initial Catalog = EditFormApplication.Models.NewFormContext; Integrated Security=True";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            SqlCommand command = new SqlCommand();
            command.CommandText = "SELECT * FROM NewForms WHERE Id = "+id+"";
            command.Connection = connection;
            var reader = command.ExecuteReader();
            if (reader.HasRows) 
            {
                while (reader.Read()) 
                {
                    string HeadForm = reader.GetString(1);
                    return HeadForm;
                }
            }
            return "false";
         }
    }

Например, здесь я возвращаю HeadForm из таблицы «NewForm».Но для вызова элемента из таблицы «Поле» мне нужно создать соединение для него отдельно.Можно ли сделать это с одним sqlconnection или получить всю модель или структуру модели?Мне нужно отправить данные из базы данных в View в формате JSON.Также мне нужно сделать это без рамок сущности.

1 Ответ

0 голосов
/ 23 февраля 2019

Единственный способ сделать это - сделать inner join для таблицы и выбрать поля в запросе ADO или хранимой процедуре.Затем вам придется вручную заполнять свои модели в коде, создавая группу на основе идентификатора NewForm и / или других полей.Для этого вы также можете использовать LINQ GroupBy.

ОБНОВЛЕНИЕ Пример:

SQL будет записан как

SELECT * FROM NewForms nf
  JOIN Field f on nf.Id = f.NewFormId

И затемв коде, выполняя DataReader для этого запроса

var dict = new Dictionary<int, NewForms>();

while(reader.HasRows)
{
    var id = int.Parse(reader["Id"].ToString())

    if(!dict.ContainsKey(id))
    {
        var newForm = new NewForms()
        {
            // Map properties from reader
        }

        dict[newForm.Id] = newForm; 
    }

    // Create Field from the reader's columns 
    var field = new Field()
    {
        // Map properties from reader
    };

    dict[id].Field.Add(field);
}

var newForms = dict.Values.ToList();

Использование словаря здесь для эффективного сопоставления полей без вложенного цикла.

PS: В коде могут быть ошибки компиляции, так как я набрал его из головы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...