如何从匿名类型列表中迭代?

时间:2010-07-27 09:20:15

标签: c# .net linq-to-entities lambda anonymous-types

我有这个linq到实体查询:

c.CreateQuery<T_Hotels>("T_Hotels").Where(item => item.Id > 0).GroupBy(item => new { item.Location, item.Name }).Select(group => new { group.Key, Total = group.Sum(item => item.Id) })

我想在类Helper的方法中实现所有内容,如何声明GroupBy和Select的表达式,返回类型是什么?

public IQueryable<???> GetHotelsGroupBy(Expression<Func<T_Hotels, bool>> pWhere,
         ??? pGroupBy, ??? pSelect)
{
   return c.CreateQuery<T_Hotels>("T_Hotels").Where(pWhere).GroupBy(pGroupBy).Select(pSelect);

}

抱歉我的英语。 ノ

2 个答案:

答案 0 :(得分:1)

理想情况下,匿名类型不应在使用它们的类型之外公开,除非您乐意使用反射与它们交谈。但是,您可以返回非通用IEnumerableIList

一种名为“cast by example”的东西,它可以使anon-types恢复到您的期望,但是非常脆弱。声明一个自定义类型来表示此API上的数据会更好(而且工作量更少)。那么你不是每一步都在与系统作斗争。

答案 1 :(得分:1)

public IQueryable<TResult> GetHotelsGroupBy<TKey, TResult>(
    Expression<Func<T_Hotels, bool>> pWhere,
    Expression<Func<T_Hotels, TKey>> pGroupBy, 
    Expression<Func<IGrouping<TKey, T_Hotels>, TResult>> pSelect
)
{
    return c.CreateQuery<T_Hotels>("T_Hotels")
            .Where(pWhere)
            .GroupBy(pGroupBy)
            .Select(pSelect);
}