1

linq を使用して 2 つのデータテーブルを結合しようとしています

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」の定義が含まれておらず、「System.Data.DataRow」タイプの最初の引数を受け入れる拡張メソッド「LinkDoc」はありませんというエラーが表示されます' が見つかる可能性があります (using ディレクティブまたはアセンブリ参照がありませんか?)。

inv430.Field("linkdoc") を使用せずに inv430.LinkDoc などの DataTable の列を参照するにはどうすればよいですか?

結果セットでグループ化したい場合は、考えています

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
4

1 に答える 1

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
             };
于 2012-11-11T09:38:54.647 に答える