【问题标题】:Creating a DataTable From a Linq Query in my C# Windows form在我的 C# Windows 窗体中从 Linq 查询创建数据表
【发布时间】:2018-11-21 15:26:21
【问题描述】:

从 Linq 查询创建数据表 我使用 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!    

【问题讨论】:

  • 我相信DataGridView 应该支持匿名类型——当你使用你的代码时会发生什么?
  • 不像 Datatable 那样什么意思?您已经拥有可用于执行各种搜索的一切。一个 DataTable 增加了什么?
  • @Gert Arnold,感谢您的回复。如果我有一个以 A 或 B 开头的名称,那么它只会在我写孔名称时显示,它不会在开头进行过滤。但是如果是带有 SqlConnecting 的 Datatable ,那么我只需要输入例如“Johannes”我只是需要输入 J 然后在我输入“Johannes”之前显示所有以 J 开头的名字。但是现在我必须把“约翰内斯”告诉我所有叫约翰内斯的人。对不起,如果我让你感到困惑..;)
  • 看,DataTable 没有任何事情。如果您将它用于选择查询,那么它就是完成这项工作的查询。您只是有一个不同的查询,其中包含类似StartsWith 的内容。你可以在 LINQ 中做同样的事情 (u.FirstName.StartWith...)
  • @GertArnold 你的意思是像这样的 u.FirstName.StartsWith == 用户名吗?

标签: c# linq datatable


【解决方案1】:

改为使用 query.ToList();

使用

 query.CopyToDataTable();

【讨论】:

  • 只有在query 返回IEnumerable<DataRow>DataRow 的子类时才有效。
  • @NetMage 感谢您的回复,但是我该如何制定 IEnumerable
  • @Paulo ,感谢您的回复,但我的代码应该如何?
  • @HelenTekie 我不建议这样做。
  • @NetMage 谢谢。这对我来说太复杂了所以我更喜欢使用SqlConnection。但是我的项目是由 ADO:NET ENTITY DATA MODEL 构建的。所以可以实现两个不同的连接字符串,一个是 ADO.NET 实体,另一个是 SqlConnection System.Data.SqlClient ?因为什么时候使用 DataTable 它比 SqlConnection 工作得更好。但是在一个项目中使用两个不同的连接是不正常的吗?
【解决方案2】:

我不建议这样做,而且我不认为您的搜索问题与不使用 DataTable 相关,但使用这些扩展,您可以将查询答案转换为 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2011-01-21
    • 1970-01-01
    相关资源
    最近更新 更多