2010-10-13 131 views
2

當您查詢現有linq結果時,就像它們被卡在比原始結果更深的層中。讓我解釋一下我的意思。關於查詢Linq結果的問題

在下面的示例中,在獲取ResultSorted後,要獲取其中的數據,您必須使用RowSorted.All.TableData.Field,但在未排序的Result中,您只需執行Row.TableData.Field。在排序後的數據中,您必須使用.All來獲取其餘的數據,這就像是一個額外的圖層,用於獲取您要查找的數據。

我怎樣才能得到它,所以我可以查詢結果沒有得到這額外的層?謝謝Stack-O!

var Result = 
from a in Db.Table 
select new {TableData = a}; 

var ResultSorted = 
from a in Result 
orderby a.TableData.Field 
select new {All = a}; 

foreach(var RowSorted in ResultSorted) 
{ 
    MessageBox.Show(RowSorted.All.TableData.ToString()); 
} 

回答

3

您可以使用

var Result = 
from a in Db.Table 
select a; 

var ResultSorted = 
from a in Result 
orderby a.Field 
select a; 

foreach(var RowSorted in ResultSorted) 
{ 
    MessageBox.Show(RowSorted.ToString()); 
} 

編輯: 的事情是,

select new {TableData = a}; 

創建一個新的匿名類型有一個名爲資料表場,這樣

class Tmp1 
{ 
    TableType TableData {get; set;} 
} 

select new {All = a}; 

創建一個新的匿名類型有一個名爲資料表場,這樣

class Tmp2 
{ 
    Tmp1 All {get; set;} 
} 

編輯2:
如果select a直接不創建額外的匿名鍵入,而是返回TableType

0
var ResultSorted = 
    from a in Db.Table 
    orderby a.Field 
    select a.ToString(); 

編輯:固定的,沒有看到第一個查詢。現在應該是相同的。無需一直創建匿名對象。

0

您在每個LINQ查詢返回匿名類型的新實例:

select new {TableData = a}; 
select new {All = a}; 

你所說的編譯器(在第一個LINQ查詢),「給我一個新的實例我想要這個匿名類型擁有一個名爲TableData的屬性,我希望該屬性的值爲a。「

如果您只是簡單地返回a而不是anoymous類型,則不需要通過嵌套類型的屬性來獲取數據。試試這個:

var Result = 
from a in Db.Table 
select a; 

var ResultSorted = 
from a in Result 
orderby a.TableData.Field 
select a; 

foreach(var RowSorted in ResultSorted) 
{ 
    MessageBox.Show(RowSorted.ToString()); 
}