我有这些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;}
}
但我无法正确使用它们,因为我可能在查询中放错了它们。你可以帮助我,以便我可以让第二个查询返回一个已定义的对象吗?感谢。
答案 0 :(得分:1)
你的代码中有这个:
for (i in 1:length(list_of_nested_node_names )) {
position_in_list <- paste(position_in_list, "[[\"", list_of_nested_node_names[i], "\"]]", sep = "")
eval(parse(text = paste(position_in_list, "<- list(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
答案 1 :(得分: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üe
和MyCount
的类型?编译器无法猜测此处推断的类型,特别是没有从匿名类型到ProcessedType
的隐式转换。
编辑:我脑海中引用我的第一部分的唯一假设是一个隐含类型的数组,你也可以写new[] { 1 }
,这将被隐含地声明为int[]
。
答案 2 :(得分: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();