Ссылка на столбцы DataTable с Linq
Я пытаюсь соединить две таблицы данных с помощью linq
var invoices420 = dt420_.AsEnumerable();
var invoices430 = dt430_.AsEnumerable();
var query = from inv430 in invoices430
join inv420 in invoices420 on inv430.LinkDoc equals inv420.LinkDoc
orderby inv430.SID
select new
{
LinkDoc = inv430.LinkDoc,
TotalIn = Math.Round(inv430.Credit, 2),
TotalOut = ((inv420 == null) ? 0 : Math.Round(inv420.Debit, 2))
};
Присоединение не является проблемой, но я получаю сообщение об ошибке "System.Data.DataRow" не содержит определения для "LinkDoc" и метода расширения "LinkDoc", принимающего первый аргумент типа "System.Data.DataRow". 'может быть найдено (вы пропустили директиву using или ссылку на сборку?).
Что мне нужно сделать, чтобы ссылаться на столбец в DataTable, например inv430.LinkDoc без использования inv430.Field("linkdoc")?
Если я хочу сделать группу по набору результатов, я думаю,
var q2 = query
.GroupBy(item => item.LinkDoc);
return q2.ToArray();
Проблема в том, что в q2 я не получаю все столбцы (linkdoc, totalin, totalout).
Исходные данные
dt420_
Linkdoc Credit
Invoice1 500
Invoice2 100
Invoice3 200
dt430_
LinkDoc Debit
Invoice1 100
Invoice1 100
Invoice2 200
Result would be
LinkDoc TotalIn(Credit) TotalOut(Debit)
Invoice1 500 200
Invoice2 100 200
Invoice3 200 0
1 ответ
Вам нужно заменить все места, которые вы вызывали, прямо на свойства, такие как
inv430.LinkDoc
в
inv430["LinkDoc"]
inv430 это DataRow
поэтому вам нужно использовать индексатор, который получает строку.
РЕДАКТИРОВАТЬ: ваше объединение принесет неверные данные (см. Мой комментарий ниже). Вам нужно использовать этот код:
var group430 = from inv430 in invoices430
group inv430 by inv430["LinkDoc"].ToString().Trim() into g
select new
{
LinkDoc = g.Key.ToString().Trim(),
TotalOut = g.Sum(inv => Math.Round((decimal)inv["Debit"], 2))
};
var group420 = from inv420 in invoices420
group inv420 by inv420["LinkDoc"].ToString().Trim() into g
select new
{
LinkDoc = g.Key.ToString().Trim(),
TotalIn = g.Sum(inv => Math.Round((decimal)inv["Credit"], 2))
};
var result = from inv430 in group430
join inv420 in group420 on inv430.LinkDoc equals inv420.LinkDoc into inv
from inv420 in inv.DefaultIfEmpty()
select new
{
inv430.LinkDoc,
TotalOut = inv430.TotalOut,
TotalIn = inv420 != null ? inv420.TotalIn : 0
};