c#-将DataTable转换为列表,并将特定列计数为Linq形式

时间:2019-06-07 03:50:59

标签: c# linq

  1. 如何将数据表转换为可以访问其列的列表。
  2. Linq计数在特定列中。

    DataTable dt = new DataTable(); List <> list = DataTable(); label1.Text = list.Count ....在哪里? label2.Text = list.Count ....在哪里?

1 个答案:

答案 0 :(得分:1)

对于第一个问题:

为了将datatable转换为List,首先必须定义一个与数据表的列匹配的类。

由于您尚未为Datatable定义任何架构。 例如,我将使用名为dtUsers的数据表,其中3 cols和2 rows为:

----------------------------
|  Id  |  Fname  |  Lname  |
----------------------------
|  1   |  John   |  Wick   |
----------------------------
|  2   |  Keanu  |  Reeves |
----------------------------

将其转换为类,如下:

public class User
{
  public int Id {get:set;}
  public string Fname {get:set;}
  public string Lname {get:set;}
}

现在有 2 种方法可以实现它:

  

使用Newtonsoft.Json( Fast

Datatable转换为List的最简单方法是将数据表serializing并将其deserializing转换为class

按照上面的示例,这是完成的方式:

//Assuming that the data is already in the datatable "dtUsers" we first serialize it.
var strUsers = JsonConvert.SerializeObject(dtUsers);

//will output an searialized object of the datatable as:'[{Id:1,"Fname":"John","Lname":"Wick"},{Id:2,"Fname":"Keanu","Lname":"Reeves"}]'

//now deserialize it back into a List<User> as:
var lstUsers = JsonConvert.DeserializeObject<List<User>>(strUsers);
  

通过匹配属性信息(

如果T是通用方法,则可以使用给定的方法将数据表转换为List。

在这里,我们首先使datatable用作AsEnumerable,然后遍历datatable中的每一行,并将它们传递到createObject<T>(row)函数中以获取其类对象,然后将其附加到列表中并返回转换后的对象。

    public List<T> ConvertDatatableToList<T>(DataTable table) where T : class, new()
    {
        try
        {
            List<T> list = new List<T>();
            foreach (var row in table.AsEnumerable())
            {
                var obj = createObject<T>(row);
                list.Add(obj);
            }
            return list;
        }
        catch (Exception ex)
        {
            throw null;
        }
    }

    public T createObject<T>(DataRow row) where T : class, new()
    {
        T obj = new T();
        //itterating over the properties defined in the class
        foreach (var prop in obj.GetType().GetProperties())
        {
            try
            {
                //checking if the property is a generic type and if it is Nullable(?)
                if (prop.PropertyType.IsGenericType && prop.PropertyType.Name.Contains("Nullable"))
                {
                    if (!string.IsNullOrEmpty(row[prop.Name].ToString()))
                        prop.SetValue(obj, Convert.ChangeType(row[prop.Name], Nullable.GetUnderlyingType(prop.PropertyType), null));
                }
                else
                    prop.SetValue(obj, Convert.ChangeType(row[prop.Name], prop.PropertyType), null);

            }
            catch
            {
                continue;
            }
        }
        return obj;
    }

用法:

var lstUsers = ConvertDatatableToList<User>(dtUsers);

关于第二个问题:

要获取计数,您可以将条件放入Where()中并对其进行计数,也可以将条件直接放入Count()本身中:

对于带有Where()的特定列:

var FnameCount = lstUsers.Where(w=>w.Fname=="John").Count(); 

对于仅包含Count()的特定列:

var FnameCount = lstUsers.Count(w=>w.Fname=="John");