Запрос к DataTable с использованием LINQ - PullRequest
5 голосов
/ 14 мая 2011

Первые извинения, если я не объясню это должным образом, я занимался этим часами, и сейчас утро.

Я перепробовал так много методов, получил так много ошибок, что я не могу вспомнить исходную версию, и я не могу решить проблему, вот мой код, это ужасно, так как я должен использовать запрос на соединение, мои 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;

Когда я пытаюсь перебрать набор данных, используя следующее:

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>");
}

Я получаю:

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

У кого-нибудь есть идеи? Абсолютно мертвый мозг, так что это может быть что-то простое.

Спасибо

Edit:

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

Ошибка: не удалось найти реализацию шаблона запроса для типа источника «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);

Ответы [ 2 ]

8 голосов
/ 14 мая 2011

dt.Rows.Add() принимает DataRow, но ваше обеспечение IEnumerable<DataRow> Также обратите внимание, что строки могут быть добавлены только к DataTable, созданному с помощью dt.NewRow(), попробуйте использовать dt.ImportRow() вместо

EDIT:

Пропустите временную таблицу данных и соедините две таблицы данных в наборе данных. Или, что еще лучше, пропустите с помощью 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;

Простой 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];
    }
}
0 голосов
/ 14 мая 2011

Не забудьте

using System.Linq;

, иначе вы не сможете использовать ни один метод расширения LINQ.


Попробуйте это:

  • Добавитьссылка на System.Data.DataSetExtensions.dll
  • IEnumerable<DataRow> r = ds.Tables["Customers"].AsEnumerable();
  • Используйте любой метод расширения LINQ для него:

    from r in ds.Tables["Customers"].AsEnumerable()
    where r.Field<Guid>("customerid") == row[2]
    select r;
    

Ваш код ADO.NET может выглядеть лучше:

using (DataSet ds = new DataSet())
{
    using (SqlConnection conn = new SqlConnection(connstring))
    using (SqlDataAdapter ad = new SqlDataAdapter("", conn))
    {
        ad.Fill(ds);
    }

    // access ds;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...