[英]Reference DataTable columns with 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指令或程序集引用?)。
在不使用inv430.Field(“ linkdoc”)的情況下,如何引用DataTable中的列(例如inv430.LinkDoc)?
如果我想按結果集分組,我在想
var q2 = query
.GroupBy(item => item.LinkDoc);
return q2.ToArray();
問題是在第二季度我沒有得到所有的列(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
您需要將所有直接調用的位置替換為屬性,例如
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
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.