我有一个来自我正在检索的数据集的linq语句。问题是有一个字段可以是字符串或数字TYPE,具体取决于我从哪个表中提取信息。 (两个表都具有相同的字段名称)。这是linq:
List<clsTableData> allFieldsList = (from g in ds.Tables["Default"].AsEnumerable()
select new clsTableData
{
tableName = g.Field<string>("tablename"),
custAccount = int.TryParse(g.Field<string>("accountNum"), out result) ?
Convert.ToInt32(g.Field<System.Int64>("accountNum")) :
12345
}
).ToList();
现在,如果字段类型是字符串,则它可以工作。如果它是数字,它给我一个错误“无法将System.Int64类型的对象强制转换为类型System.String”。但是,该值已经放在int(custAccount)中:
public class clsTableData
{
public string tableName { get; set; }
public int custAccount { get; set; }
}
似乎int.TryParse中存在问题。 (我不一定要使用int.TryParse。我实际上认为正确的解决方案是找出字段类型是否为整数而不是检查字段值)任何帮助将不胜感激。
回答
感谢MethodMan,它已被解决:
List<clsTableData> allFieldsList = (from g in ds.Tables["Default"].AsEnumerable()
select new clsTableData
{
tableName = g.Field<string>("tablename"),
custAccount = g["accountNum"].GetType() == typeof(System.Int64) ?
Convert.ToInt32(g.Field<System.Int64>("accountNum")) :
12345
}
).ToList();
感谢MethodMan!这是答案:
List<clsTableData> allFieldsList = (from g in ds.Tables["Default"].AsEnumerable()
select new clsTableData
{
tableName = g.Field<string>("tablename"),
custAccount = g["accountNum"].GetType() == typeof(System.Int64) ?
Convert.ToInt32(g.Field<System.Int64>("accountNum")) :
12345
}
).ToList();
您可以在其上调用ToString()
,以便始终从字符串对象进行转换。
List<clsTableData> allFieldsList = (from g in ds.Tables["Default"].AsEnumerable()
select new clsTableData
{
tableName = g.Field<string>("tablename"),
custAccount = int.TryParse((g.Field<string>("accountNum")).ToString(), out result) ?
Convert.ToInt32(g.Field<System.Int64>("accountNum")) :
12345
}
).ToList();
您可以直接检查字段类型,而不是通过推断它:
select new clsTableData
{
tableName = g.Field<string>("tablename"),
custAccount = dtRow.Table.Columns["accountNum"].DataType == typeof(System.Int64) ?
Convert.ToInt32(g.Field<System.Int64>("accountNum")) :
12345
}