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)
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)
| 归档时间: |
|
| 查看次数: |
47493 次 |
| 最近记录: |