【发布时间】:2018-09-23 02:38:24
【问题描述】:
我正在尝试将 SQL 表中的所有记录作为 IEnumerable 返回,例如电子邮件帐户表结果到 EmailAccount 的可枚举集合。我使用了一个名为 SelectAll 的方法,它执行一个 SQL 脚本,然后将 DataTable 作为 Enumerable 返回。
问题是当尝试使用 GetItem 方法将 Int64 类型的表中的某些列转换为具有 long 类型的匹配属性的 T 对象时,我收到错误“Int64Converter cannot convert from System.Int64 ' 在第 'pro.SetValue(obj, typeConverter.ConvertFrom(dr[column.ColumnName]), null);' 行。
关于如何将 Int64 值从表结果转换为 long 属性的任何建议?
public void Test()
{
var results = SelectAll<EmailAccount>();
....
}
public class EmailAccount
{
public long Id { get; set; }
public string Name { get; set; }
public ImapEnum ImapType { get; set; }
}
public IEnumerable<T> SelectAll<T>() where T : new()
{
var tableName = "EmailAccount"; // TableName<T>();
var results = ExecuteReader($"SELECT * FROM {tableName};");
if (results == null || results.Rows.Count == 0) return null;
return results.AsEnumerable().Select(GetItem<T>);
}
private static T GetItem<T>(DataRow dr)
{
var temp = typeof(T);
var obj = Activator.CreateInstance<T>();
foreach (DataColumn column in dr.Table.Columns)
{
foreach (var pro in temp.GetProperties())
{
if (pro.Name == column.ColumnName)
{
if (pro.PropertyType == typeof(Enum) || pro.PropertyType.BaseType == typeof(Enum))
{
pro.SetValue(obj, Enum<StringComparison>.ToObject(dr[column.ColumnName]), null);
}
else
{
var typeConverter = TypeDescriptor.GetConverter(pro.PropertyType);
pro.SetValue(obj, typeConverter.ConvertFrom(dr[column.ColumnName]), null);
}
}
else
continue;
}
}
return obj;
}
【问题讨论】: