2010-03-03 24 views
1

我想我需要做到這一點,而是使用LINQ to DataSets,因爲「Transactions」表在DB2中,並且沒有數據上下文。如何將LINQ中的孫表中的字段求和到DataSet where子句中?

Linq query across three levels of tables to generate sum

我設置2個DataRelations對數據集:
1.涉及分類(ds.tables [0]在我的例子),以產品(ds.tables [1])
2.涉及產品以交易(ds.tables [2])

var query = from x in ds.tables[0].AsEnumerable() 
    orderby x.Field<int>("Priority") 
    select new { 
     Name = x.Field<string>("Text"), 
     Amount = //maybe using GetChildRows here??? 
    }; 

我真的不知道該怎麼辦的金額。提前致謝!

+0

目前尚不清楚是否您從交易表要記錄在DS加載或他們只在數據庫中。即使他們沒有加載,你仍然可以在數據庫中創建DataRelation。如果他們*被加載,那麼它應該很容易做到。如果他們不是,事情會變得更加粘性。 – 2010-03-05 03:41:20

+0

對不起,有任何混淆。一切都在DataSet中加載。類別和產品在SQL Server數據庫中,而事務來自DB2。我的另一個想法是將DB2加載到SQL Server的臨時表中,並使用LINQ to SQL,但我認爲這會更簡單。 – 2010-03-05 13:04:43

回答

1

如果在交易表需要行的DS被加載,那麼我認爲你可以這樣做:

DataRelation relationToProducts; 
DataRelation relationToTransactions;  
var query = from x in ds.tables[0].AsEnumerable() 
orderby x.Field<int>("Priority") 
select new { 
    Name = x.Field<string>("Text"), 
    Amount = x.GetChildRows(relationToProducts) 
      .Sum(product => product.GetChildRows(relationToTransactions) 
        .Sum(tx => tx.Field<decimal>("Amount"))) 
}; 
+0

我將很快測試。 – 2010-03-05 13:01:26

+0

適用於DataRelation約束。不過,我想我已經發現了另一個潛在的警告。如果我的事務記錄不全部具有相應的父值,則添加約束將引發ArgumentException。我的交易表可能包含在產品中沒有相應父值的記錄。所以,也許使用DataRelation和GetChildRows不是最好的主意。我應該問一個新問題嗎? – 2010-03-05 14:36:32

+0

修復:DataRelation(string,datacolumn,datacolumn,bool)的另一個構造函數可以將bool(createConstraints)設置爲false。 – 2010-03-05 14:55:36