Преобразование DataReader в объект C#

у меня есть класс

public class Person
{
 public string Name {get; set;}
 public List<string> Friends {get; set;}
}

У меня есть устройство чтения данных, которое извлекает эти значения из базы данных, и я хочу заполнить указанный выше класс с помощью DataReader.

Обычно детали выглядят так, как показано ниже

Name    Friends
John    Caleb
John    Matthew
John    Simon
Andrew  Bolton
Andrew  Mark

Мне нужно сгруппировать это по имени и заполнить класс списком друзей для каждого имени.

Может ли кто-нибудь помочь с этим. Я не могу получить список друзей с группировкой. Какой будет правильный код для достижения этой логики. Спасибо


person Gladstone Jaffrey    schedule 13.08.2020    source источник
comment
Пожалуйста, не меняйте суть вашего вопроса, иначе никто больше не захочет на него отвечать...   -  person Horitsu    schedule 13.08.2020
comment
Извини за это. На самом деле я не могу прочитать устройство чтения данных и получить значения.   -  person Gladstone Jaffrey    schedule 13.08.2020
comment
Нет, я не использую Dapper   -  person Gladstone Jaffrey    schedule 13.08.2020
comment
Я бы посоветовал почитать о Даппере.   -  person mjwills    schedule 13.08.2020
comment
В основном вы будете заполнять List<person> внутри цикла while dataReader, в котором вы можете поставить галочку для существующего человека по имени, и если он существует, то добавить друга только в список friends, а если нет, то добавить нового человека   -  person Mohtisham Zubair    schedule 13.08.2020
comment
Удалите этот () после Person. Как сейчас, ваш код не компилируется.   -  person Tanveer Badar    schedule 13.08.2020
comment
Поэтому я попытался дать вам ответ. И да, из-за проблемы в вопросе, возможно, это еще один более быстрый способ чтения и прочее. Но у меня есть сомнения, что вы действительно работаете с таблицей отношений дружбы. И я не думаю, что оптимизированный до крайности код действительно поможет вам в конце концов.   -  person Horitsu    schedule 13.08.2020


Ответы (1)


Я предполагаю, что ваш стол похож на (имя, друг)

ты должен прочитать в своей таблице дружбы

тогда вы должны сгруппировать их, как с

var groupedTempList = tempList.GroupBy(a=>a.Name)

а потом

List<Person> t = new List<Person>();

foreach(var Item in groupedTempList) 
{ 
    Person tP = new Person() {Name = Item.Key};
    foreach(YourTableEquivalentClass subitem in Item)
    {
        tP.Friends.Add(subitem.Friend);
    }
}

А вот расширение для dbreader:

    public static int? GetNullableInteger(this SqlDataReader dbReader, string name)
    {
        var tVal = dbReader[name];
        if (Convert.IsDBNull(tVal)) return null;
        return new int?(int.Parse(tVal.ToString()));
    }

    public static int GetInteger(this SqlDataReader dbReader, string name)
    {
        int? tVal = dbReader.GetNullableInteger(name);
        if (tVal == null) throw new ArgumentNullException("Der abgerufene int/int ist null/DbNull!");
        return (int)tVal;
    }


    public static string GetString(this SqlDataReader dbReader, string name)
    {
        var tVal = dbReader[name];
        if (Convert.IsDBNull(tVal)) return null;
        return tVal.ToString();
    }

И чтение в вещах

                List<YourTableEquivalentClass> temp = new List<YourTableEquivalentClass>();
                string sqlComStr =
                      @"SELECT [Name]
                              ,[Friend]
                          FROM [YourDadabase].[dbo].[YourFriendshipTable]";
                using (SqlConnection con = new SqlConnection(YourConnectionString))
                {
                    con.Open();
                    using (SqlCommand sqlCom = new SqlCommand(sqlComStr, con))
                    {
                        using (SqlDataReader dbReader = sqlCom.ExecuteReader())
                        {
                            if (dbReader.HasRows)
                            {
                                while (dbReader.Read())
                                {
                                    temp.Add(new YourTableEquivalentClass()
                                    {
                                        Name = dbReader.GetString("Name"),
                                        Friend = dbReader.GetString("Friend")
                                    });
                                }
                            }
                        }
                    }
                }
person Horitsu    schedule 13.08.2020
comment
И да, возможно, есть более короткое выражение LINQ для части кода 1. и 2. - person Horitsu; 13.08.2020