C# C数据读取器到DTO?

C# C数据读取器到DTO?,c#,ado.net,dto,C#,Ado.net,Dto,资料 DTO 我可以直接从db数据到DTO进行对话。例如,我想要下面这样的东西。可能存在对数据库的另一个数据访问 cat1: { values: {3 ,5, 2}, dates: {date1, date2, data5} cat2: { values: {6 ,7, 2}, dates: {date8, date1, data6} 有可能吗?怎么可能?我希望,我可以解释…鉴于日期和值属性是可变列表,您可以一次只读取一行,不分组,然后键入按名称键入的词典,同时添加日期和值: IEnumera

资料

DTO

我可以直接从db数据到DTO进行对话。例如,我想要下面这样的东西。可能存在对数据库的另一个数据访问

cat1: { values: {3 ,5, 2}, dates: {date1, date2, data5}
cat2: { values: {6 ,7, 2}, dates: {date8, date1, data6}
有可能吗?怎么可能?我希望,我可以解释…

鉴于日期和值属性是可变列表,您可以一次只读取一行,不分组,然后键入按名称键入的词典,同时添加日期和值:

IEnumerable<MeterReadingsChartData> MeterReadingsChartData;
while (reader.Read())
{
     // fill chart data DTO
}
请注意:

我已经计算了您的属性名称,以遵循.NET命名约定 在您的LINQ代码中,您使用了ToArray,如果您的属性是真正的列表,它实际上不会编译。。。如果您的属性实际上是数组,那么上述方法将不起作用 与其有两个单独的列表,不如使用一个列表,甚至创建一个只包含日期和值的单独阅读类。 您可以将数据交给接受名称的构造函数,在构造函数中初始化列表,使列表属性为只读,还可以创建AddReadingDateTime、double方法以使调用代码更干净。 鉴于日期和值属性是可变列表,您只需一次读取一行解组,然后键入一个按名称键入的字典,在执行时添加日期和值:

IEnumerable<MeterReadingsChartData> MeterReadingsChartData;
while (reader.Read())
{
     // fill chart data DTO
}
请注意:

我已经计算了您的属性名称,以遵循.NET命名约定 在您的LINQ代码中,您使用了ToArray,如果您的属性是真正的列表,它实际上不会编译。。。如果您的属性实际上是数组,那么上述方法将不起作用 与其有两个单独的列表,不如使用一个列表,甚至创建一个只包含日期和值的单独阅读类。 您可以将数据交给接受名称的构造函数,在构造函数中初始化列表,使列表属性为只读,还可以创建AddReadingDateTime、double方法以使调用代码更干净。
@JonSkeet,我试着按照你的建议去做,就像下面的一样,它是有效的。但我不知道下面的代码与您的建议完全相同

DTO

数据获取和转换

public class MeterReadingsChartData
{
    public string Name { get; set; }
    public string TypeName { get; set; }
    public string Unit { get; set; }
    public List<Tuple<DateTime, double>> DateAndValue { get; set; }

    public MeterReadingsChartData(string name, List<Tuple<DateTime, double>> dateAndValue, string typeName, string unit)
    {
        this.Name = name;
        this.DateAndValue = dateAndValue;
        this.TypeName = typeName;
        this.Unit = unit;
    }
}
结果是我期望的


非常感谢。

@JonSkeet,我试着按照你的建议做,效果很好。但我不知道下面的代码与您的建议完全相同

DTO

数据获取和转换

public class MeterReadingsChartData
{
    public string Name { get; set; }
    public string TypeName { get; set; }
    public string Unit { get; set; }
    public List<Tuple<DateTime, double>> DateAndValue { get; set; }

    public MeterReadingsChartData(string name, List<Tuple<DateTime, double>> dateAndValue, string typeName, string unit)
    {
        this.Name = name;
        this.DateAndValue = dateAndValue;
        this.TypeName = typeName;
        this.Unit = unit;
    }
}
结果是我期望的


非常感谢。

非常感谢您的回复,如果我还有一个道具,例如unit,那么我可以添加以下内容:readings[unit]=group@AliRızaAdıyahşi:不,可能不是——关键是名字是关键。您可能会将Unit=Unit放在组的对象初始值设定项中。非常感谢您的回复,如果我还有一个道具,例如Unit,那么我可以添加以下内容:readings[Unit]=group@AliRızaAdıyahşi:不,可能不是——关键是名字是关键。您可能会将Unit=Unit放在group的对象初始值设定项中。
var readings = new Dictionary<string, MeterReadingsChartData>();
while (reader.Read())
{
     string name = reader.GetString(0);
     DateTime date = reader.GetDateTime(1);
     double value = reader.GetDouble(2);

     MeterReadingsChartData group;
     if (!readings.TryGetValue(name, out group))
     {
         group = new MeterReadingsChartData {
             Name = name, 
             Values = new List<double>(),
             Dates = new List<DateTime>()
         };
         readings[name] = group;    
     }
     group.Values.Add(value);
     group.Dates.Add(date);
}
public class MeterReadingsChartData
{
    public string Name { get; set; }
    public string TypeName { get; set; }
    public string Unit { get; set; }
    public List<Tuple<DateTime, double>> DateAndValue { get; set; }

    public MeterReadingsChartData(string name, List<Tuple<DateTime, double>> dateAndValue, string typeName, string unit)
    {
        this.Name = name;
        this.DateAndValue = dateAndValue;
        this.TypeName = typeName;
        this.Unit = unit;
    }
}
var readings = new Dictionary<string, MeterReadingsChartData>();

while (reader.Read())
{
    string name = reader.GetString(5);
    DateTime date = reader.GetDateTime(1);
    double value = reader.GetDouble(2);
    string typeName = reader.GetString(3);
    string unit = reader.GetString(4);

    MeterReadingsChartData group;
    if (!readings.TryGetValue(name, out group))
    {
        group = new MeterReadingsChartData(name, new List<Tuple<DateTime, double>>(), typeName, unit);
        readings[name] = group;
        readings[typeName] = group;
        readings[unit] = group;
    }
    group.DateAndValue.Add(new Tuple<DateTime, double>(date, value));
}