2014-11-21 1 views
0

все. У меня возникли проблемы с поиском лучшим способом для извлечения данных из отношений NN ...«Слияние» SQL приводит к C# с LINQ

У меня есть следующий запрос SQL и ResultSet:

select 
    p.PersonID, 
    Name, 
    PhoneNumber 
from Persons p 
left join PhoneNumbers n on p.PersonID = n.PersonID; 

PersonID Name   PhoneNumber 
----------- ------------ -------------------- 
1   John   1111111 
1   John   2222222 
1   John   3333333 
2   Maria  4444444 
2   Maria  5555555 
3   Billy  6666666 

То, что я хочу делать в клиентском приложении (C#) заключается в анализе этих результатов на множество объектов. Сейчас у меня есть следующий код, но мне интересно, если есть лучший способ сделать это ...

public class Person 
{ 
    public int ID; 
    public string Name; 
    public List<PhoneNumbers> PhoneNumbers = new List<PhoneNumbers>(); 
} 

public class PhoneNumbers 
{ 
    public Person Owner; 
    public string PhoneNumber; 
} 

public List<Person> GetPersons() 
{ 
    const string query = @"select 
          p.PersonID, 
          Name, 
          PhoneNumber 
          from Persons p 
          left join PhoneNumbers n on p.PersonID = n.PersonID;"; 

    DataTable dataTable = Select(query); 

    var groups = from row in dataTable.Rows.Cast<DataRow>() 
       group row by row["PersonID"]; 

    List<Person> persons = new List<Person>(); 
    foreach (var group in groups) 
    { 
     Person person = new Person 
     { 
      ID = (int)group.ElementAt(0)["PersonID"], 
      Name = group.ElementAt(0)["Name"] as string 
     }; 

     foreach (var row in group) 
     { 
      person.PhoneNumbers.Add(new PhoneNumbers 
      { 
       Owner = person, 
       PhoneNumber = row["PhoneNumber"] as string 
      }); 
     } 

     persons.Add(person); 
    } 

    return persons; 
} 

Спасибо большое.

+0

Вы можете использовать LINQ-SQL. Вы можете показать схему таблицы базы данных? –

ответ

0

Считаете ли вы использование инструмента ORM?

ORM, объектно-реляционное сопоставление, является инструментом, позволяющим запрашивать и обрабатывать данные из базы данных с использованием парадигмы объектов. Вообще говоря,, это означает, что у вас будут объекты C#, представляющие ваши таблицы.

Это также означает, что вы можете использовать LINQ для запроса к базе данных, а не SQL. ORM, переводит LINQ в SQL и передает выполнение в базу данных. В обратном пути он отобразит результаты в объект C#, с которым вам гораздо легче работать.

Есть довольно много, чтобы выбрать из, но некоторые из популярных на стеке .NET включают в себя:

+0

Yup, у меня есть. Я хочу попробовать позже в других проектах, но на этот раз мне действительно нужно сделать это с помощью ADO.NET. Большое спасибо, хотя –

0

Вот что я в итоге сделал. Это далеко не лучшее, но, по крайней мере, это лучше, чем раньше.

public class Person 
{ 
    public int ID; 
    public string Name; 
    public List<PhoneNumbers> PhoneNumbers; 
} 

public class PhoneNumbers 
{ 
    public int PersonID; 
    public string PhoneNumber; 
} 

public List<Person> GetPersons() 
{ 
    const string query = @"select 
          p.PersonID, 
          Name, 
          PhoneNumber 
          from Persons p 
          left join PhoneNumbers n on p.PersonID = n.PersonID;"; 

    DataTable dataTable = Select(query); 

    return (from row in dataTable.Rows.Cast<DataRow>() 
     group row by row["PersonID"] into rows 
     select new Person 
     { 
      ID = (int) rows.Key, 
      Name = rows.First()["Name"] as string, 
      PhoneNumbers = (from r in rows 
       select new PhoneNumbers 
       { 
        PersonID = (int) rows.Key, 
        PhoneNumber = rows.First()["PhoneNumber"] as string 
       }).ToList() 
     }).ToList(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^