Priya-Kiko Ответов: 2

Как решить ошибку - невозможно оценить выражение. Операция не поддерживается. Неизвестная ошибка: 0x80070057


DataTable dttable = new DataTable();
dttable.Columns.Add("billno", typeof(String));
dttable.Columns.Add("date", typeof(DateTime));
dttable.Columns.Add("time", typeof(String));
dttable.Columns.Add("covers", typeof(Decimal));
dttable.Columns.Add("trcode", typeof(String));
dttable.Columns.Add("scode", typeof(String));
dttable.Columns.Add("gname", typeof(String));
dttable.Columns.Add("total", typeof(Decimal));
dttable.Columns.Add("login", typeof(String));
dttable.Columns.Add("resno", typeof(String));
dttable.Columns.Add("custcode", typeof(String));
dttable.Columns.Add("resnum", typeof(Int32));
dttable.Columns.Add("sname", typeof(String));
dttable.Columns.Add("name", typeof(String));
dttable.Columns.Add("qty", typeof(Decimal));
dttable.Columns.Add("rate", typeof(Decimal));

var rows = from mobjbmast in Context.bmasts.AsEnumerable()
           join mobjbtran in Context.btrans
           on mobjbmast.billno equals mobjbtran.billno
           join mobjwaiter in Context.waiters
           on mobjbmast.scode equals mobjwaiter.code
           where mobjbmast.billno == mbillno
           select dttable.LoadDataRow(new object[]
           {
                 mobjbmast.billno,
                 mobjbmast.date,
                 mobjbmast.time,
                 mobjbmast.covers,
                 mobjbmast.trcode,
                 mobjbmast.scode,
                 mobjbmast.gname,
                 mobjbmast.total,
                 mobjbmast.login,
                 mobjbmast.resno,
                 mobjbmast.custcode,
                 mobjbmast.resnum,
                 mobjwaiter.name,
                 mobjbtran.name,
                 mobjbtran.qty,
                 mobjbtran.rate
           }, false);


Приведенный выше код не возвращает никаких строк в datatable, и при отладке переменная 'rows' показывает ошибку :

Невозможно оценить выражение. Операция не поддерживается. Неизвестная ошибка: 0x80070057

Пожалуйста, предложите. Заранее спасибо.

Что я уже пробовал:

var rows = from mobjbmast in Context.bmasts.AsEnumerable()
           join mobjbtran in Context.btrans.AsEnumerable()
           on mobjbmast.billno equals mobjbtran.billno
           join mobjwaiter in Context.waiters.AsEnumerable()
           on mobjbmast.scode equals mobjwaiter.code
           where mobjbmast.billno == mbillno
           select new { billno = mobjbmast.billno, date = mobjbmast.date, time = mobjbmast.time, trcode = mobjbmast.trcode };


Даже это дает ту же ошибку. Если я изменю AsEnumerable() на ToList (), то получу перечисление, не дающее никаких результатов.

Maciej Los

Вы пробовали использовать AsEnumerable() метод с другими источниками данных: Context.btrans, Context.waiters?

Priya-Kiko

Спасибо за ответ. Да, я пробовал и с другими источниками данных, добавляя AsEnumerable(). И все же проблема не исчезла.

2 Ответов

Рейтинг:
11

Priya-Kiko

Этот код работает для меня. Получил это решение с одного из сайтов. Разместите это как ответ, чтобы он мог помочь какому-то другому телу. Приведенный ниже код предназначен для запроса данных из Объединенных таблиц при некотором условии и загрузки Datatable (с известными столбцами) из результирующего массива объектов.

DataTable dttable = new DataTable();

dttable.Columns.Add("billno", typeof(String));
dttable.Columns.Add("date", typeof(DateTime));
dttable.Columns.Add("time", typeof(String));
dttable.Columns.Add("covers", typeof(Decimal));
dttable.Columns.Add("trcode", typeof(String));
dttable.Columns.Add("scode", typeof(String));
dttable.Columns.Add("gname", typeof(String));
dttable.Columns.Add("total", typeof(Decimal));
dttable.Columns.Add("login", typeof(String));
dttable.Columns.Add("resno", typeof(String));
dttable.Columns.Add("custcode", typeof(String));
dttable.Columns.Add("resnum", typeof(Int32));
dttable.Columns.Add("sname", typeof(String));
dttable.Columns.Add("name", typeof(String));
dttable.Columns.Add("qty", typeof(Decimal));
dttable.Columns.Add("rate", typeof(Decimal));

var rows = from mobjbmast in Context.bmasts.AsEnumerable()
           join mobjbtran in Context.btrans
           on mobjbmast.billno equals mobjbtran.billno
           join mobjwaiter in Context.waiters
           on mobjbmast.scode equals mobjwaiter.code
           where mobjbmast.billno == mbillno
           let billarray = new object[]
           {
                mobjbmast.billno,
                mobjbmast.date,
                mobjbmast.time,
                mobjbmast.covers,
                mobjbmast.trcode,
                mobjbmast.scode,
                mobjbmast.gname,
                mobjbmast.total,
                mobjbmast.login,
                mobjbmast.resno,
                mobjbmast.custcode,
                mobjbmast.resnum,
                mobjwaiter.name,
                mobjbtran.name,
                mobjbtran.qty,
                mobjbtran.rate
            }
            select billarray;
            foreach (var array in rows)
            {
                dttable.Rows.Add(array);
            }


Рейтинг:
1

Nirav Prabtani

Вы можете попробовать

IEnumerable<DataRow> _query = ...... Your expression

DataTable boundTable = _query.CopyToDataTable<DataRow>();


Priya-Kiko

Спасибо за ответ. Я пытался сделать это так, как вы предлагали :

IEnumerable<datarow> _query = из mobjbmast в Context.bmasts.Методом asenumerable()
присоединяйтесь к mobjbtran в Context.btrans.Методом asenumerable()
на mobjbmast.billno равно mobjbtran.billno
присоединяйтесь к mobjwaiter в контексте.официанты.Методом asenumerable()
на mobjbmast.scode равно mobjwaiter.code
где mobjbmast.billno == mbillno
выберите mobjbmast;
Но он не компилируется. Как построить запрос, пожалуйста, помогите.