2013-08-27 38 views
0

我已經看過Dynamic linq,但我顯然缺少一些東西。從列表<string>在linq select子句在運行時返回列

我試圖從一個系統導入文件到另一個。我從包含文件信息的Excel工作表加載了一個DataTable。 (ExcelDataTable)。我也有一個HastSet用戶想要導入的文件。 (FilesToImport)。用戶從speadsheet中選擇他想要導入的信息,這些列是動態的,並且在運行時被選中。 (List VariablesToUpdate)。我在查詢中加入了我的ID,但我不確定如何從數據表中返回所需的列。

DataTable dt = new DataTable(); 
var query = 
    from excelRow in this.ExcelDataTable.AsEnumerable() 
    join file in this.FilesToImport.AsEnumerable() 
    on excelRow.Field<Guid>("ceGuid") equals file.SourceFileIdentifier 
    select dt.LoadDataRow(new object[] 
    <COMPLETELY LOST HERE> 
    , false); 
query.CopyToDataTable(); 

我可以解決它,如果我知道我想使用類似的東西返回;

select new { ImportSourceFilePath = excelRow.Field<string>(filePathColumn)}; 

但是就像我說過的,我的列會有所不同,直到運行時我纔會知道它們是什麼。

任何想法?

+0

你可以選擇*所有*字段作爲一個'Dictionary ',然後有另一個LINQ語句只選擇你實際需要的字段嗎? – CodingGorilla

+0

我接受了你的建議並與之一起運行。我沒有使用Dictionary,我只是使用查詢集合中的DataRow。 – ehcanadian

+0

您應該將您的代碼作爲答案發布,然後將其標記爲已接受的答案,以便您的問題不會無法解決,其他人可以從您的解決方案中受益。 – CodingGorilla

回答

0

我最終什麼事做一個小教程;

var foundExcelRows = 
from excelRow in this.ExcelDataTable.AsEnumerable() 
join file in this.FilesToImport.AsEnumerable() 
on excelRow.Field<Guid>("ceGuid") equals file.SourceFileIdentifier 
select excelRow; 

for (int i = 0; i < foundExcelRows.Count(); i++) 
{ 
    DataRow row = foundExcelRows.ElementAt(i); 
    // work with this row since I know the columns I expect 
}