用于检索单个对象的泛型方法



我研究这个方法已经有一段时间了,我想弄清楚它是如何工作的。这显然适用于返回一个对象列表。但是我目前无法弄清楚的是,我如何检索单个对象,例如"雇员e"而不是"列表"?

public static List<T> DataTableToList<T>(this DataTable table) where T : class, new()
{
    try
    {
        List<T> list = new List<T>();
        foreach (var row in table.AsEnumerable())
        {
            T obj = new T();
            foreach (var prop in obj.GetType().GetProperties())
            {
                try
                {
                    PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
                    propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
                }
                catch
                {
                    continue;
                }
            }
            list.Add(obj);
        }
        return list;
    }
    catch
    {
        return null;
    }
}

直接调用

var employee = table.DataTableToList<Employee>().FirstOrDefault();

或者(如果您的DataTable非常大),您可能希望修改您的扩展方法以返回IEnumerable<T>,使用yield关键字:

public static IEnumerable<T> DataTableToList<T>(this DataTable table) where T : class, new()
    {
        try
        {
            foreach (var row in table.AsEnumerable())
            {
                T obj = new T();
                foreach (var prop in obj.GetType().GetProperties())
                {
                    try
                    {
                        PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
                        propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
                    }
                    catch
                    {
                        continue;
                    }
                }
                yield return obj;
            }
        }
        catch
        {
            yield break;
        }
    }

这样做的好处是,该方法只会根据需要转换表中的行数。

在此方法返回的List上使用lambda表达式调用FirstOrDefault。

如果你正在寻找一个特定的Employee实例并且你在那个对象上有一个Id属性你会这样做。

var employee = employeeTableInstance.DataTableToList()。FirstOrDefault(e => id . equals (id));

这不是获取单个对象的最有效的方法,因为它需要将整个表从行实例映射到对象实例,但是如果出于其他原因仍然需要表列出功能,并且无论如何都可能调用它,那么您可以采用这种方法。

如果你不需要,那么我会看看调用DataRowCollection的查找方法,如果你是通过主键搜索或查看查询表达式,然后只是映射一行而不是所有行。查找和查询表达式的示例可以在这里找到。https://msdn.microsoft.com/en-us/library/y06xa2h1.aspx

相关内容

  • 没有找到相关文章

最新更新