2010-10-13 97 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()); 
}