C# 数据表 LINQ 动态 row.field<datatype> 需要编码
C# Datatable LINQ dynamic row.field<datatype> coded needed
我有以下代码。数据来自 mysql 服务器。我使用 dataadapater.Fill(datatable) 对象和方法来创建数据表 CDMAData。每次数据范围不同时column.datatype都不一样。我需要能够动态指定数据类型。可能吗?错误发生在 r.Field<int>.
var CarrierCDMAPreResults = from row in CDMAData.AsEnumerable()
where Dates.Contains(row.Field<DateTime>("DateTime"))
group row by new { Cascade = row.Field<string>("Cascade"), Sector = row.Field<byte>("Sector"), Carrier = row.Field<byte>("Carrier") } into grp
select new
{
Cascade = grp.Key.Cascade,
Sector = grp.Key.Sector,
Carrier = grp.Key.Carrier,
Attempts = grp.Sum(r => r.Field <int> ("Attempts")),
Successes = grp.Sum(r => r.Field<int>("Successes")),
Blocks = grp.Sum(r => r.Field<int>("Blocks")),
Drops = grp.Sum(r => r.Field<int>("Drops")),
CDMAPE = grp.Sum(r => r.Field<decimal>("CDMA Primary Erlang"))
};
好吧,对于您的问题,一个非常简单的答案就是对所有内容都使用 Int64。因为您所有较低的值仍然有效。
但是,如果您的列开始变成小数和字符串,那么您就会遇到问题。
var CarrierCDMAPreResults = from row in CDMAData.AsEnumerable()
where Dates.Contains(row.Field<DateTime>("DateTime"))
group row by new { Cascade = row.Field<string>("Cascade"), Sector = row.Field<byte>("Sector"), Carrier = row.Field<byte>("Carrier") } into grp
select new
{
Cascade = grp.Key.Cascade,
Sector = grp.Key.Sector,
Carrier = grp.Key.Carrier,
Attempts = grp.Sum(r => r.Field<Int64> ("Attempts")),
Successes = grp.Sum(r => r.Field<Int64>("Successes")),
Blocks = grp.Sum(r => r.Field<Int64>("Blocks")),
Drops = grp.Sum(r => r.Field<Int64>("Drops")),
CDMAPE = grp.Sum(r => r.Field<decimal>("CDMA Primary Erlang"))
};
我有以下代码。数据来自 mysql 服务器。我使用 dataadapater.Fill(datatable) 对象和方法来创建数据表 CDMAData。每次数据范围不同时column.datatype都不一样。我需要能够动态指定数据类型。可能吗?错误发生在 r.Field<int>.
var CarrierCDMAPreResults = from row in CDMAData.AsEnumerable()
where Dates.Contains(row.Field<DateTime>("DateTime"))
group row by new { Cascade = row.Field<string>("Cascade"), Sector = row.Field<byte>("Sector"), Carrier = row.Field<byte>("Carrier") } into grp
select new
{
Cascade = grp.Key.Cascade,
Sector = grp.Key.Sector,
Carrier = grp.Key.Carrier,
Attempts = grp.Sum(r => r.Field <int> ("Attempts")),
Successes = grp.Sum(r => r.Field<int>("Successes")),
Blocks = grp.Sum(r => r.Field<int>("Blocks")),
Drops = grp.Sum(r => r.Field<int>("Drops")),
CDMAPE = grp.Sum(r => r.Field<decimal>("CDMA Primary Erlang"))
};
好吧,对于您的问题,一个非常简单的答案就是对所有内容都使用 Int64。因为您所有较低的值仍然有效。
但是,如果您的列开始变成小数和字符串,那么您就会遇到问题。
var CarrierCDMAPreResults = from row in CDMAData.AsEnumerable()
where Dates.Contains(row.Field<DateTime>("DateTime"))
group row by new { Cascade = row.Field<string>("Cascade"), Sector = row.Field<byte>("Sector"), Carrier = row.Field<byte>("Carrier") } into grp
select new
{
Cascade = grp.Key.Cascade,
Sector = grp.Key.Sector,
Carrier = grp.Key.Carrier,
Attempts = grp.Sum(r => r.Field<Int64> ("Attempts")),
Successes = grp.Sum(r => r.Field<Int64>("Successes")),
Blocks = grp.Sum(r => r.Field<Int64>("Blocks")),
Drops = grp.Sum(r => r.Field<Int64>("Drops")),
CDMAPE = grp.Sum(r => r.Field<decimal>("CDMA Primary Erlang"))
};