我正在处理一个复杂的linq查询。
var GenderStuff =
from t1 in db.table1
join t2 in db.table2 on t1.s_id equals t2.id
let total = db.table2.Where(x => x.s_id == id).Count()
where t2.s_id == id
group t1 by new { t1.cat, total = total } into r
select new
{
r.Key.cat,
percent = (100 * (float)r.Count() / (float)r.Key.total)
};
这给了我一些我想要的东西。它给了我
[{cat:x,percent:6.66666},etc...]
我想要的只是
[[category1,6.6666],[category2,33.33333]]
关于如何使用单个linq查询执行此操作的任何想法?
答案 0 :(得分:1)
您可以再次投影到数组中。我建议在执行这样的查询后执行此操作:
query.ToList().Select(item => new object[] { item.cat, item.percent }).ToArray();
答案 1 :(得分:0)
将您的选择语句更改为
select new [] {r.Key.cat, (100 * (float)r.Count() / (float)r.Key.total) };
这仅在r.Key.cat也是浮点类型时才有效。否则,您需要执行new object[] { ...
然而这绝对是一种非常简单的做事方式。在这种情况下,匿名对象绝对是恰当的。你似乎想要一个元组,而不是一个数组 - 在这种情况下,一个匿名对象实际上比一个元组更好,因为它已正确命名字段。如果你真的想要一个元组,那么你可以使用Tuple
类和select Tuple.Create(r.key.cat, ....)