首页 > 解决方案 > 在我的 C# Windows 窗体中从 Linq 查询创建数据表

问题描述

从 Linq 查询创建 DataTable 我使用 Ling 在 dataGridview 上显示我的数据,并且我有 linq 搜索功能来搜索人员。它工作正常,但不像 Datatable 那样。我必须在我的 serch 函数给我取名之前写下洞名。我想从 Linq 查询创建一个数据表,但我不知道该怎么做。这是我的代码:

public void SerachdataEmp(string name)
{
    db = new EmployeeEntity();
    var result = (from u in db.Employee
    join d in db.Department on u.DepartmentId equals d.DepartmentId 
    where u.FirstName == name
    select new
    {                            
       FirstName = u.FirstName,
       LastName = u.LastNameName,
       DepartmentName = d.DepartmentName 
    }      
}).Tolist();
dataGridView1.DataSource = result;

我试过这样

(from u in db.Employee.AsEnumerable()
 join d in db.Department.AsEnumerable() on u.DepartmentId equals d.DepartmentId 
 where u.FirstName == searchEmployee

but then I don't know how to do. Thank you in advance!    

标签: c#linqdatatable

解决方案


我不推荐这样做,而且我不相信您的搜索问题与不使用 aDataTable相关,但使用这些扩展名,您可以将查询答案转换为DataTable-ToDataTable()代替ToList().

public static class ExtensionMethods {
    // ***
    // *** IEnumerable<> Extensions
    // ***
    public static DataTable ToDataTable<T>(this IEnumerable<T> rows) {
        var dt = new DataTable();
        if (rows.Any()) {
            var rowType = typeof(T);
            var memberInfos = rowType.GetPropertiesOrFields();
            foreach (var info in memberInfos)
                dt.Columns.Add(new DataColumn(info.Name, info.GetMemberType()));

            foreach (var r in rows)
                dt.Rows.Add(memberInfos.Select(i => i.GetValue(r)).ToArray());
        }
        return dt;
    }

    // ***
    // *** MemberInfo Extensions
    // ***
    public static Type GetMemberType(this MemberInfo member) {
        switch (member) {
            case FieldInfo mfi:
                return mfi.FieldType;
            case PropertyInfo mpi:
                return mpi.PropertyType;
            case EventInfo mei:
                return mei.EventHandlerType;
            default:
                throw new ArgumentException("MemberInfo must be if type FieldInfo, PropertyInfo or EventInfo", nameof(member));
        }
    }

    public static object GetValue(this MemberInfo member, object srcObject) {
        switch (member) {
            case FieldInfo mfi:
                return mfi.GetValue(srcObject);
            case PropertyInfo mpi:
                return mpi.GetValue(srcObject);
            default:
                throw new ArgumentException("MemberInfo must be of type FieldInfo or PropertyInfo", nameof(member));
        }
    }

    // ***
    // *** Type Extensions
    // ***
    public static List<MemberInfo> GetPropertiesOrFields(this Type t, BindingFlags bf = BindingFlags.Public | BindingFlags.Instance) =>
        t.GetMembers(bf).Where(mi => mi.MemberType == MemberTypes.Field | mi.MemberType == MemberTypes.Property).ToList();
}

推荐阅读