使用LINQ查询DataTable

Ash*_*Ash 5 .net c# linq datatable ado.net

首先道歉,如果我没有正确解释这一点,我已经在这几个小时,现在是早上.

我已经尝试了很多方法,得到了很多错误,我记不起原始版本了,我也无法解决问题,这是我的代码,这很糟糕,因为我应该使用连接查询我的SP在这台服务器上被窃听.

SqlConnection conn = new SqlConnection(connstring);
DataSet ds = new DataSet();
SqlDataAdapter ad;
SqlCommand cmd = new SqlCommand();
ad = new SqlDataAdapter("SELECT * FROM booking WHERE bookstartdate BETWEEN '" + ReturnDbDate(datefrom).ToString() + "' AND '" + ReturnDbDate(dateto).ToString() + "'", conn);
ad.Fill(ds, "CustomerIds");

ad = new SqlDataAdapter("SELECT customerid, firstname, lastname, telephone, email FROM customer", conn);
ad.Fill(ds, "Customers");

DataTable dt = new DataTable();
dt.Columns.Add("Customerid", typeof(String));
dt.Columns.Add("Firstname", typeof(String));
dt.Columns.Add("Lastname", typeof(String));
dt.Columns.Add("Telephone", typeof(String));
dt.Columns.Add("Email", typeof(String));

int lol = ds.Tables["CustomerIds"].Rows.Count;

foreach (DataRow row in ds.Tables["CustomerIds"].Rows)
{
    IEnumerable<DataRow> r = from dr in ds.Tables["Customers"].AsEnumerable()
                             where dr.Field<Guid>("customerid").ToString() == row[2].ToString()
                             select dr;
    dt.Rows.Add(r);
}

return dt;
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下内容遍历数据集时:

foreach (DataRow rows in dt.Rows)
{
    sb.Append("<tr><td>" + rows["Customerid"].ToString() + "</td><td>" + rows[1] + "</td><td>" + rows[2] +"</td><td>" + rows[3] + "</td></tr>");
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

System.Data.EnumerableRowCollection`1 [的System.Data.DataRow]

任何想法?完全是脑死亡,所以它可能是简单的事情.

谢谢

编辑:

DataRow r = from dr in ds.Tables["Customers"]
            where dr.Field<Guid>("customerid").ToString() == row[2].ToString()
            select dr;    
dt.ImportRow(r);
Run Code Online (Sandbox Code Playgroud)

错误:无法找到源类型"System.Data.DataTable"的查询模式的实现.'哪里'找不到.

我假设我的LINQ语法不正确,虽然我认为有一种IEnumberable<T>.Where()方法?我记得它,只是不记得如何访问它.

EDIT2:

我失败了,设法再次重新制造问题,感叹

 IEnumerable<DataRow> r = from dr in ds.Tables["Customers"].Select().Where(x => x.Field<Guid>("customerid").ToString() == row[2].ToString())
                            select dr;



                dt.ImportRow(r);
Run Code Online (Sandbox Code Playgroud)

Mag*_*nus 8

dt.Rows.Add()发生在一个DataRow,但你提供IEnumerable<DataRow> 另外请注意,行只能添加到DataTable已与创建dt.NewRow()使用try dt.ImportRow()代替

编辑:

跳过临时DataTable并加入数据集中的两个数据表.或者甚至更好,跳过使用linq并加入数据库查询中的表.

return 
  from dr in ds.Tables["Customers"].AsEnumerable()
  join dr2 in ds.Tables["CustomerIds"].AsEnumerable()
    on dr.Field<Guid>("customerid") equals dr2.Field<Guid>(2)
  select dr;
Run Code Online (Sandbox Code Playgroud)

普通的SQL

public DataTable GetCustomers(DataTime datefrom, DataTime dateto)
{
    var sql = @"
        SELECT customer.customerid, firstname, lastname, telephone, email
        FROM customer
        JOIN booking
            ON customer.customerid = booking.customerid
        WHERE bookstartdate BETWEEN '" + ReturnDbDate(datefrom).ToString() + "' AND '" + ReturnDbDate(dateto).ToString() + "'";

    using (SqlConnection conn = new SqlConnection(connstring))
    using (SqlDataAdapter ad = new SqlDataAdapter(sql, conn))
    {
            DataSet ds = new DataSet();
            ad.Fill(ds);
            return ds.tables[0];
    }
}
Run Code Online (Sandbox Code Playgroud)