none
Linq вывести последнюю запись RRS feed

  • Вопрос

  • Таблица №1 один ко многим Таблица №2
    Нужно вывести данные из двух таблиц в один DataGridView.
    Из таблицы №1 вывести все записи.
    Из таблицы №2 вывести по одной записи(только последнюю запись которая отвечает таблице №1)
    16 декабря 2010 г. 18:49

Ответы

  • DataTable tbl1 = new DataTable();
    tbl1.Columns.Add("id", typeof(Int64));
    tbl1.Columns.Add("name", typeof(String));
    tbl1.Rows.Add(1, "a1");
    tbl1.Rows.Add(2, "a2");
    tbl1.Rows.Add(3, "a3");
    
    DataTable tbl2 = new DataTable();
    tbl2.Columns.Add("id", typeof(Int64));
    tbl2.Columns.Add("id_tb1", typeof(Int64));
    tbl2.Columns.Add("name", typeof(String));
    tbl2.Rows.Add(1, 1, "b1");
    tbl2.Rows.Add(2, 1, "b2");
    tbl2.Rows.Add(3, 2, "b3");
    tbl2.Rows.Add(4, 2, "b4");
    tbl2.Rows.Add(5, 3, "b5");
    tbl2.Rows.Add(6, 3, "b6");
    tbl2.Rows.Add(7, 3, "b7");
    
    var query = from t1 in tbl1.AsEnumerable()
          from t2 in
            (from t2 in tbl2.AsEnumerable()
             group t2 by t2.Field<Int64>("id_tb1") into t22
             select t22).AsEnumerable()
          where t1.Field<Int64>("id") == t2.Last().Field<Int64>("id_tb1")
          select new { name1 = t1.Field<String>("name"), name2 = t2.Last().Field<String>("name") };
    
    dataGridView1.DataSource = query.AsEnumerable().ToList();
    

    • Предложено в качестве ответа Abolmasov Dmitry 17 декабря 2010 г. 9:03
    • Помечено в качестве ответа Abolmasov Dmitry 21 декабря 2010 г. 19:22
    17 декабря 2010 г. 7:07

Все ответы

  • DataTable tbl1 = new DataTable();
    tbl1.Columns.Add("id", typeof(Int64));
    tbl1.Columns.Add("name", typeof(String));
    tbl1.Rows.Add(1, "a1");
    tbl1.Rows.Add(2, "a2");
    tbl1.Rows.Add(3, "a3");
    
    DataTable tbl2 = new DataTable();
    tbl2.Columns.Add("id", typeof(Int64));
    tbl2.Columns.Add("id_tb1", typeof(Int64));
    tbl2.Columns.Add("name", typeof(String));
    tbl2.Rows.Add(1, 1, "b1");
    tbl2.Rows.Add(2, 1, "b2");
    tbl2.Rows.Add(3, 2, "b3");
    tbl2.Rows.Add(4, 2, "b4");
    tbl2.Rows.Add(5, 3, "b5");
    tbl2.Rows.Add(6, 3, "b6");
    tbl2.Rows.Add(7, 3, "b7");
    
    var query = from t1 in tbl1.AsEnumerable()
          from t2 in
            (from t2 in tbl2.AsEnumerable()
             group t2 by t2.Field<Int64>("id_tb1") into t22
             select t22).AsEnumerable()
          where t1.Field<Int64>("id") == t2.Last().Field<Int64>("id_tb1")
          select new { name1 = t1.Field<String>("name"), name2 = t2.Last().Field<String>("name") };
    
    dataGridView1.DataSource = query.AsEnumerable().ToList();
    

    • Предложено в качестве ответа Abolmasov Dmitry 17 декабря 2010 г. 9:03
    • Помечено в качестве ответа Abolmasov Dmitry 21 декабря 2010 г. 19:22
    17 декабря 2010 г. 7:07
  • Я работаю с базами данных SQL Sever.

    Я сделал как ты говоришь, но ошибка "Оператор запроса "Last" не поддерживается."

     

     

     var Qvery = from s in data().oplata
    
                            group s by s.idClient into p2
    
                            select p2;
    
                return from cl in data().client
    
                       from p in Qvery
    
                       where(cl.id==p.Last().idClient)
    
                       select new
    
                       {
    
                          ПІБ=cl.pib,
                          Оплачено_до=p.Last().oplachenoDo
    
                       };
    

     

    17 декабря 2010 г. 22:49
  • Fire55, вы решили данную проблему?

    Если вам помог какой-либо ответ, то, пожалуйста, не забывайте нажимать кнопку 'Пометить как ответ' на данном ответе.


    Для связи [mail]
    19 декабря 2010 г. 12:06
  • Я работаю с базами данных SQL Sever.

    Я сделал как ты говоришь, но ошибка "Оператор запроса "Last" не поддерживается."

     

     

     

     var Qvery = from s in data().oplata
    
    
    
                            group s by s.idClient into p2
    
    
    
                            select p2;
    
    
    
                return from cl in data().client
    
    
    
                       from p in Qvery
    
    
    
                       where(cl.id==p.Last().idClient)
    
    
    
                       select new
    
    
    
                       {
    
    
    
                          ПІБ=cl.pib,
    
                          Оплачено_до=p.Last().oplachenoDo
    
    
    
                       };
    
    

     

     


    Действительно, в TSQL нет ничего подобного оператору Last, потому и нельзя пребразовать. Но если во второй таблице поля типа id int identity(1,1) или DateCreated, можно использовать OrderByDesc.First, что преобразуется в select top 1 ...... order by ..... , или использовать Max, что и пребразуется в max. Надеюсь мысль понятна....
    Москва
    20 января 2011 г. 9:39