AmlinChris Ответов: 2

Linq запрос к DataTable


Всем привет,

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

Я уже целую вечность смотрю в интернете! Я видел советы класса ObjectShredder, данные на MSDN, но не могу полностью разобраться в них, и я перепробовал огромное количество других потенциальных решений, увы, безрезультатно.

Не мог бы кто-нибудь указать, где я ошибаюсь, или может быть быстрым указателем на то, как заставить класс ObjectShredder решить эту проблему?
Любая помощь на этом этапе более чем приветствуется!
Заранее спасибо

Крис

Оригинальный кусок кода:

Dim query = From a In dt _    Join b In dtLossEvents _    On _    a.Field(Of Integer)("EventID") Equals b.Field(Of Integer)("EventID") _    Select New With { _                    a, _                    b _                    }


Это ее последнее ущербное воплощение:
Dim query = From a In dt _            Join b In dtLossEvents _            On _            a.Field(Of Integer)("EventID") Equals b.Field(Of Integer)("EventID") _            Select New With { _                             .Gross_Loss = a.Field(Of Double ("Gross_Loss"), _                             .Net_Loss = a.Field(Of Double)("Net_Loss"), _                             .EventID = b.Field(Of Integer)("EventID") _}

2 Ответов

Рейтинг:
1

AmlinChris

Привет

Большое спасибо за вашу помощь. К сожалению, это заняло несколько дней, чтобы проверить.

К сожалению, я все еще получаю ошибку "CopyToDataTable не является членом системы.Коллекции.Общий.IEnumerable (анонимного типа)". Это очень расстраивало меня, так как я чувствовал, что вы направили меня туда правильным курсом. Ниже приведен мой код, любая помощь была бы сейчас очень кстати!

Заранее всем спасибо

Крис





Dim items = From a In dt.AsEnumerable() _
    Join b In dtLossEvents.AsEnumerable() On _
    a.Field(Of Integer)("EventID") Equals b.Field(Of Integer)("EventID") _
    Select New With { _
                     .Gross_Loss = dt("Gross_Loss"), _
                     .Net_Loss = dt("Net_Loss"), _
                     .EventID = dtLossEvents("EventID") _
                    }



Dim result As DataTable = items.CopyToDataTable()


ledtech3

обозреватель объектов имеет CopyToDataTable в списке как в
Системы.Данных.DataTableExtension.CopyToDataTable......

просто поместите CopyToDataTable в поиск браузера объектов, и вы должны найти 3 ссылки.
Надеюсь, это немного поможет.

wizardzz

Это должно быть опубликовано как ответ на решение №1, это не ответ.

dmcgill50

Ладно, серьезно...Я получил две части обратной связи по одному сообщению о решении. Первый хотел знать, как я "нашел" вопрос, которому было 2,5 года. Ответ: я использовал возможность фильтрации для определенного ответа на вопрос. Не так уж и сложно, и кажется, что именно это и задумал разработчик сайта. ;)
Второй сказал мне не отвечать на вопросы, которые слишком стары, так как оператору все равно. Я не был оперативником, и мне было все равно, поэтому я предполагаю, что те, кто стоит за мной, будут заботиться. Эти вопросы и ответы предназначены не только для операции. Это должно быть очевидно...

kesiw

Я не понимаю. Я использую C# - я не могу заставить copyToDataTable работать. Я использую запрос, который соединяет две таблицы. Он дает результаты, но терпит неудачу, когда я пытаюсь скопировать результаты в datatable с помощью copyToDataTable

Рейтинг:
0

LookSharp

Я использую C#, а не VB.Net, поэтому, пожалуйста, простите меня за то, что я отвечаю с использованием образцов в C#, но я надеюсь, что тем не менее смогу оказать некоторую помощь.

Ваш второй пример выше, кажется, на 90% подходит к рабочему решению, с двумя вещами (возможно, только одной, потому что я не знаю, какие удобства VB.Net обеспечивает Linq to DataTables) отсутствуют, которые мешают вам получить DataTable из Linq.

Я создал тестовое приложение и попытался создать запрос Linq, подобный тем, которые вы моделируете выше. Я обнаружил, что должен использовать from xxx in tableName.AsEnumerable() ... (где призыв к методом asenumerable() был решающим проницательностью), чтобы получить LINQ, чтобы принять таблицу имя в from пункт. Если ваш запрос Linq не будет компилироваться, это может быть вашим решением этой части проблемы.

Второе, с чем я экспериментировал, - это заставить Linq возвращать DataTable-потому что, как вы говорите, Linq сам по себе возвращает IEnumerable анонимного типа. Вот тут-то и появляется ObjectShredder. Я скопировал пример кода ObjectShredder дословно, и это сработало. Чтобы использовать ObjectShredder, вы преобразуете IEnumerable, возвращаемый вашим запросом Linq, в DataTable со следующим: DataTable result = queryResult.CopyToDataTable();.

Вот мой метод тестирования:

private static DataTable JoinDataTablesWithLinq()
    {
    var query = from inv in _tblInvoice.AsEnumerable()
                join item in _tblLineItem.AsEnumerable()
                    on inv["InvoiceId"] equals item["InvoiceId"]
                select new
                        {
                            CustomerName = inv["CustomerName"],
                            ItemName = item["ItemName"],
                            Quantity = item["Quantity"]
                        };

    return query.CopyToDataTable();
    }


Вот несколько полезных ссылок:
ObjectShredder (который у вас, вероятно, уже есть): http://msdn.microsoft.com/en-us/library/bb669096.aspx[^]
Использование Linq с таблицами данных: http://dotnetarchitect.wordpress.com/2009/03/18/using-linq-to-manipulate-data-in-datasetdatatable/[^]


dmcgill50

Dim items = From a In dt.Методом asenumerable() _
Присоединяйтесь к b в dtLossEvents.AsEnumerable () On _
a. поле (целого числа) ("EventID") Равно b. поле (целого числа) ("EventID") _
Выберите Создать С Помощью { _
.Gross_Loss = ДТ("Gross_Loss"), _
.Net_Loss = ДТ("Net_Loss"), _
.Код события = dtLossEvents("код события") _
}



Тусклый результат как DataTable = items.CopyToDataTable()


должно быть

Dim items = From a In dt.Методом asenumerable() _
Присоединяйтесь к b в dtLossEvents.AsEnumerable () On _
a. поле (целого числа) ("EventID") Равно b. поле (целого числа) ("EventID") _
Выберите Создать С Помощью { _
.Gross_Loss = а("Gross_Loss"), _
.Net_Loss = а("Net_Loss"), _
.Код события = б("код события") _
}



Тусклый результат как DataTable = items.CopyToDataTable()