2015-09-10 3 views
0

У меня есть хранимая процедура с левой присоединиться, которая возвращает что-то вроде этого:Возвращает массив из db?

name1 car1 
name1 car2 
name1 car3 
name2 car1 
name3 null 
name4 null 

Мне нужно хранить этот результат в объекте, как это:

class Person 
{ 
    string Name; 
    List<string> Cars; 
} 

Что такое лучший способ сделать это? Либо непосредственно в хранимой процедуре, либо в коде после получения результата запроса.

То, что я делаю сейчас, - это то, что у меня есть результат из db, чтобы перебрать его и добавить имя и его список автомобилей C# другому объекту, если имя еще не существует.

Есть ли лучшее решение для этого?

+0

Какую технологию доступа к данным вы используете? Можете ли вы предоставить код того, как вы выполняете хранимую процедуру? –

+0

Я использую Dapper, называя его так: query queryResult = PersonRepo.ExecuteQuery ("dbo.GetPersonsCars", null, CommandType.StoredProcedure) .ToList(). Класс PersonInfo похож на класс Person, указанный выше, но Cars не является списком, а простой строкой. Так что я должен создать 2 класса. – Andrea

ответ

0

Предполагая, что вы DataReader возвращение объединения результатов, которые я хотел бы сделать это:

 Dictionary<string, List<string>> people = new Dictionary<string, List<string>>(); 
     while (reader.Read()) 
     { 
      string name = reader.GetString(0); 
      string car = reader.GetString(1); 
      List<string> cars = null; 
      if (!people.TryGetValue(name, out cars)) 
      { 
       people[name] = cars = new List<string>(); 
      } 
      if (null != car) 
       cars.Add(car); 
     } 

Каждая пара словаря ключ/значение представляет человека. Но теперь вы можете создавать экземпляры Person из записей словаря, если они вам все еще нужны. Я бы просто использовал словарь для доступа к людям и их автомобилям.

0

Я бы написал более многоразовый класс DataAccess, который всегда возвращает IEnumerable<T>. В зависимости от ваших требований вы можете/не захотите позвонить .ToList(), чтобы принудительно выполнить перечисление.

После этого вы можете делать все, что вы хотите, как преобразование IEnumerable<T> к тому, что вам нужно, как IDictionary<string, List<string>>, или, возможно, использовать метод .GroupBy() LINQ, которые могут удовлетворить ваши требования также.

У вас есть варианты, это точно.

+0

, например, часть кода, пожалуйста? – Andrea

0

Предположим, у вас есть две таблицы в вашей базе данных. Person и Cars. Для простоты предположим, что у человека есть две колонки PersonID, Name, в то время как автомобили имеют три столбца CarID, Name, PersonID. Поле PersonID в таблице «Автомобили» является ключевым ключом, который связывает автомобиль с человеком.

Простой запрос, который связывает ваш Person к вашему автомобилю

string query = @" 
SELECT p.PersonID, p.Name, c.CarID, c.Name 
FROM Person p LEFT JOIN Cars c on p.PersonID = c.PersonID"; 

и это может быть ваша модель

public class Person 
{ 
    public int PersonID {get;set;} 
    public string Name { get; set; } 
    public List<Car> Cars {get;set;} 
} 
public class Car 
{ 
    public int CarID { get; set; } 
    public string Name { get; set; } 
    public int PersonID {get;set;} 
} 

Теперь вы могли бы написать эту работу с Dapper

var lookup = new Dictionary<int, Person>(); 
using (IDbConnection cnn = GetOpenConnection()) 
{ 
    var people = cnn.Query <Person, Car, Person>(query, (per, car) => 
    { 
     Person found; 
     if (!lookup.TryGetValue(per.PersonID, out found)) 
     { 
      found = per; 
      lookup.Add(per.PersonID, found); 
      found.Cars = new List<Car>(); 
     } 
     found.Cars.Add(car); 
     return found; 
    }, splitOn: "CarID").Distinct(); 
} 
Смежные вопросы