2017-04-25 46 views
0

我有这些LINQ查询:如何使用对象而不是匿名类型

 var type1 = (from ftr in db.TB_FTR 
           join mst in db.TB_MST on ftr.MST_ID equals mst.MST_ID 
           join trf in db.TYPE_ID on mst.TYPE_ID equals trf.ID 
           where ftr.CITY == city && ftr.COUNTY == county 
           select new MyType { City = ftr.CITY, County = ftr.COUNTY Type = trf.TYPE } 
      ).OrderBy(i => i.City); 

     var type2 = type1.GroupBy(i => new { i.City, i.County, i.Type }) 
      .Select(group => new { Name = group.Key, MyCount = group.Count() }) 
      .OrderBy(x => x.Name).ThenByDescending(x => x.MyCount) 
      .GroupBy(g => new { g.Name.City, g.Name.County }) 
      .Select(g => g.Select(g2 => 
      new { Name = new { g.Key.City, g.Key.County, g2.Name.Type }, g2.MyCount })).Take(1000).ToList(); 

正如你所看到的第二个查询返回匿名类型。但我想在一个方法中使用这些查询。所以我不能返回匿名类型。我怎样才能使type2成为非匿名类型?

我已经准备了两个对象:

public class MyType 
{ 
     public string City { get; set; } 
     public string County { get; set; } 
     public string Type { get; set; } 
} 

public class ProcessedType 
{ 
public MyType Name {get; set;} 
public int MyCount {get; set;} 
} 

但是因为我可能在查询放错位置的他们,我无法正确地使用它们。你能帮助我,这样我可以使第二个查询返回一个定义的对象?谢谢。

回答

1

您在代码中有这样的:

new { Name = new { g.Key.City, g.Key.County, g2.Name.Type }, g2.MyCount } 

目前仍在匿名类型。你必须把在那里的实际类型的名称要能返回他们:

new ProcessedType { Name = new MyType { g.Key.City, g.Key.County, g2.Name.Type }, g2.MyCount } 

看你的代码,你也应该能够分配现有Name太:

new ProcessedType { Name = g2.Name, g2.MyCount } 
1

每当你写new不是后跟一个类型名称,您创建一个anoynmous类型的实例。正如你正确地发现你不能将这些实例传递给其他方法(有效地,你可以使用可以是,因为即使匿名类型继承自System.Object,但这种方式会丢失实际类型的所有类型信息)。

在你的情况下,你都准备好一个命名的类型 - ProcessedType。因此,而不是这样的:

new { Name = new { g.Key.City, g.Key.County, g2.Name.Type }, g2.MyCount } 

使用本:

new ProcessedType 
{ 
    Name = new MyType { g.Key.City, g.Key.County, g2.Name.Type }, 
    MyCount = g2.MyCount 
} 

这是为什么错误?那么,编译器应该如何知道你实际上是指ProcessedType而不是其他类型的可能具有相同属性的类型MyTypüeMyCount?编译器不可能猜测这里推断的类型,特别是不存在从匿名类型到ProcessedType的隐式转换。

编辑:coms我脑海中引用我的第一部分的唯一假设是隐式类型数组,您也可以在其中编写new[] { 1 },这将隐含声明为int[]

1

试试这个

var type2 = type1.GroupBy(i => new { i.City, i.County, i.Type }) 
     .Select(group => new { Name = group.Key, MyCount = group.Count() }) 
     .OrderBy(x => x.Name).ThenByDescending(x => x.MyCount) 
     .GroupBy(g => new { g.Name.City, g.Name.County }) 
     .Select(g => g.Select(g2 => 
     new ProcessedType{ Name = new MyType { City = g.Key.City, County = g.Key.County, Type = g2.Name.Type }, MyCount = g2.MyCount })).Take(1000).ToList(); 
相关问题