具有连接,计数和百分比的复杂Linq查询

时间:2014-07-16 20:37:53

标签: c# linq

我正在处理一个复杂的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查询执行此操作的任何想法?

2 个答案:

答案 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, ....)