【问题标题】:Save linq query as data table将 linq 查询另存为数据表
【发布时间】:2012-09-12 10:35:49
【问题描述】:

在c#MVC中,我需要在数据表中得到如下的“结果”(var)。

var allCompanies = objentity.ExecuteFunction<SearchAvailEmployees_Result>("SearchAvailEmployees", lstParam.ToArray())
                            .ToList();

var result = from c in allCompanies select new[] { 
                            c.LastName, 
                            c.FirstName, 
                            c.Phone, 
                            c.City, 
                            c.PositionApplied, 
                            c.Status, 
                            Convert.ToString(c.CallDate.Value.ToShortDateString()), 
                            Convert.ToString(c.CellOrPager), 
                            c.Gender 
                        };

我尝试了以下代码,但它不起作用。它给出的错误为

“无法将类型 'System.Collections.Generic.IEnumerable' 隐式转换为 'System.Collections.Generic.IEnumerable'。存在显式转换(您是否缺少强制转换?)”

IEnumerable<DataRow> query = from c in allCompanies select new[] { 
                                            c.LastName, 
                                            c.FirstName, 
                                            c.Phone, 
                                            c.City, 
                                            c.PositionApplied, 
                                            c.Status, 
                                            Convert.ToString(c.CallDate.Value.ToShortDateString()), 
                                            Convert.ToString(c.CellOrPager), 
                                            c.Gender 
                                        };

DataTable boundTable = query.CopyToDataTable<DataRow>();

将linq查询结果保存在数据表中的任何替代解决方案?

【问题讨论】:

    标签: c# asp.net-mvc linq datatable


    【解决方案1】:

    这就是我的做法:

    首先我声明一个新的DataTable 并在此添加列:

    DataTable dt = new DataTable();
    dt.Columns.Add("FirstName");
    dt.Columns.Add("LastName");
    DataRow row = null;
    

    现在我执行所需的查询:

    var query = from c in allCompanies select { c.LastName, c.FirstName};
    

    现在我只需遍历查询并填写DataTable

    foreach (var rowObj in query)
    {
        row = dt.NewRow();
        dt.Rows.Add(rowObj.FirstName, rowObj.LastName);
    }
    return dt;
    

    在我的查询中,我仍在使用“加入”语句。

    【讨论】:

      【解决方案2】:

      首先,使用正确的架构创建DataTable

      var dataTable = new DataTable();
                  dataTable.Columns.Add("LastName", typeof (string));
                  dataTable.Columns.Add("FirstName", typeof(string));
                  // Add more columns
      

      二、选择值对象数组:

      var result = allCompanies.Select(c => new object[] {
                          c.LastName, 
                          c.FirstName, 
                          c.Phone, 
                          c.City, 
                          c.PositionApplied, 
                          c.Status, 
                          Convert.ToString(c.CallDate.Value.ToShortDateString()), 
                          Convert.ToString(c.CellOrPager), 
                          c.Gender 
                      }).ToList();
      

      第三,循环从DataTable创建新Row并将值赋给新Row:

      result.Foreach(array => {
           var row = dataTable.NewRow();
           row.ItemArray = array;
           dataTable.Rows.Add(row);
          });
      

      【讨论】:

        【解决方案3】:

        你应该在new之后删除[],它就像

        var result = from c in allCompanies 
                     select new { c.LastName, c.FirstName, c.Phone, c.City, 
                     c.PositionApplied, c.Status, 
                     CallDate = Convert.ToString(c.CallDate.Value.ToShortDateString()), 
                     CellOrPager = Convert.ToString(c.CellOrPager), c.Gender };
        

        在此处创建数据表

        var dataTable = new DataTable();
        dataTable.Columns.AddRange( new DataColumn[]{ 
            new DataColumn("LastName" , typeof(string)),
            new DataColumn("FirstName" , typeof(string)),
            new DataColumn("Phone" , typeof(string)),
            new DataColumn("City" , typeof(string)),
            new DataColumn("PositionApplied" , typeof(string)),
            new DataColumn("Status" , typeof(string)),
            new DataColumn("CallDate" , typeof(string)),
            new DataColumn("CellOrPager" , typeof(string)),
            new DataColumn("Gender" , typeof(string))
        });
        

        使用此结果填充 DataTable

        result.ToList().ForEach(x=>{
           var row = dataTable.NewRow();
        
           row.["LastName"] = x.LastName;
           row.["FirstName"] = x.FirstName;
           row.["Phone"] = x.Phone;
           row.["City"] = x.City;
           row.["PositionApplied"] = x.PositionApplied;
           row.["Status"] = x.Status;
           row.["CallDate"] = x.CallDate;
           row.["CellOrPager"] = x.CellOrPager;
           row.["Gender"] = x.Gender;
        
           dataTable.Rows.Add(row);
        });
        

        【讨论】:

        • 现在它在两个“convert.tostring() 语句”上都给出了以下错误
        • 哪个错误,是NullReferenceException吗?如果是,则 c.CallData.Value 可以为 null。
        • 抱歉这里出现错误“无效的匿名类型成员声明器。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。”
        • 答案已更新,将这些 toString 结果分配给成员。检查答案。
        • 再次抱歉,它给出了我在问题中提到的相同错误:(
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多