Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Запрос к двум таблицам в DataSet  [new]
Azeke
Member

Откуда:
Сообщений: 230
Привет.
Сделал загрузку данных из удаленной базы в обьект DataSet:

        private void button1_Click(object sender, EventArgs e)
        {
            string sdate = String.Format("{0:dd/MM/yyyy}", dateTimePicker1.Value.AddDays(-4));
            string ndate = String.Format("{0:dd/MM/yyyy}", dateTimePicker1.Value);
            string sql_nat = "select vags.mm_d, vags.mm_id, vags.sec_mod, vags.sec_num" +
                                " from (select distinct m.mm_d,m.mm_dor, m.mm_id, ss.sec_mod, ss.sec_num" +
                                   " from mmdoc.mmmm m inner join mmdoc.mmmslog log on" +
                                   " m.mm_d=log.mm_d and" +
                                   " m.mm_dor=log.mm_dor" +
                                   " left join mmdoc.mmmss ss on" +
                                   " m.mm_d=ss.mm_d and" +
                                   " m.mm_dor=ss.mm_dor" +
                                   " where pr_mm_proc='1' and pr_mm_d='0' and pr_mm_dd='0' and m.mm_d='" + ndate + "') vags" +
                                " where vags.mm_id not in (select mm_id from ASOUP.mmmv_tr)" +
                                " group by vags.mm_d, vags.mm_id, vags.sec_mod, vags.sec_num;";

            string sql_s200 = "select STF, PNS, STN, OPER_ID_ST, OPER_TS, OPER, NUM, SEC_MOD, SEC_NUM, SEC_CODE, URVS" +
                              " from ASOUP.POEZD" +
                              " where SEC_MOD is not null and SEC_NUM is not null and" +
                              " OPER_TS between timestamp('" + sdate + "', '00.00.00') and timestamp('" + ndate + "', '00.00.00')" +
                              " order by STF,PNS,STN,OPER_TS,OPER;";

            string connectionString = "Provider=IBMDADB2;Database=dd;Hostname=10.10.0.85;Protocol=TCPIP; Port=50000;Uid=Administrator;Pwd=123;";
            OleDbConnection conn = new OleDbConnection(connectionString);
            conn.Open();           
            OleDbDataAdapter da = new OleDbDataAdapter(sql_nat, conn);
            OleDbDataAdapter da1 = new OleDbDataAdapter(sql_s200, conn);
            DataSet ds = new DataSet();
            da.Fill(ds, "mm");
            da1.Fill(ds, "s200");
          
           // необходимый запрос LINQ описание ниже.

            dataGridView1.DataSource = ; //результат запроса LINQ
            conn.Close();
        }
Теперь мне необходимо сравнить обе таблицы и вывести в dataGridView1 все данные из таблицы mm и только те данные из s200 которые совпадают sec_mod, sec_num. (Как я понимаю это можно сделать LINQ. Я с ним пока не сталкивался почитал в инете не совсем понял)

т.е. SQL запрос того что мне надо:
select mm.mm_d, mm.mm_id, mm.sec_mod, mm.sec_num, s200.STF, s200.PNS, s200.STN, s200.OPER_ID_ST, s200.OPER_TS, s200.OPER, NUM, s200.SEC_MOD, s200.SEC_NUM
from mm left join s200 on
mm.sec_mod=s200.SEC_MOD and
mm.sec_num=s200.SEC_NUM;

5 апр 10, 15:35    [8580636]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к двум таблицам в DataSet  [new]
Azeke
Member

Откуда:
Сообщений: 230
Пробую так:

IEnumerable<string> query =
                from c in mm_tab
                join p in s200_tab
                on new { c.sec_mod, c.sec_num } equals new { p.sec_mod, p.sec_num }
                select new { c.mm_id, c.sec_mod, c.sec_num, p.STF, p.PNS, p.STN };
но пишет ошибку:

Error 3 Could not find an implementation of the query pattern for source type 'System.Data.DataTable'. 'Join' not found.
6 апр 10, 09:13    [8583387]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к двум таблицам в DataSet  [new]
Azeke
Member

Откуда:
Сообщений: 230
Переделал вот так:
var query =
                from mm_tab in mm_tabs.AsEnumerable()
                join s200_tab in s200_tabs.AsEnumerable()
                on mm_tab.Field<string>("sec_mod") equals s200_tab.Field<string>("sec_mod")
                into mm_s200
                from mm in mm_s200.DefaultIfEmpty()
                select new {mm_id=mm_tab.Field<string>("mm_id"), STF=(mm.Field<string>("STF")==null ? String.Empty : mm.Field<string>("STF"))};

вроде разобрался (проверка синтаксиса ошибку не дает)

теперь хочу вывести результат в компонент
dataGridView1

Пишу так:
DataTable result = query.CopyToDataTable();
            dataGridView1.DataSource = result;
Но ругается на query.CopyToDataTable()
Error 3 The type 'AnonymousType#1' cannot be used as type parameter 'T' in the generic type or method 'System.Data.DataTableExtensions.CopyToDataTable<T>(System.Collections.Generic.IEnumerable<T>)'. There is no implicit reference conversion from 'AnonymousType#1' to 'System.Data.DataRow'.

Прочитал в инете статью про это http://msdn.microsoft.com/ru-ru/library/bb669096.aspx

Это про мой случай. Только я там не разобрался мне нужно в программе новый класс создовать для обработки и т.д. Это долгая история. Вопрос к вам гуру С# подскажите как можно связать dataGridView1 с результатом запроса?
7 апр 10, 07:49    [8589589]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к двум таблицам в DataSet  [new]
Azeke
Member

Откуда:
Сообщений: 230
Никто с этим раньше не сталкиваля.
Такое ощушение, что я один на этом форуме.
Второй день прошу помощи и тишина.
7 апр 10, 10:14    [8590209]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к двум таблицам в DataSet  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Он же Вам пишет в чем беда...
7 апр 10, 12:44    [8591564]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить