C# C数据读取器到DTO?
资料 DTO 我可以直接从db数据到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
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));
}