我刚刚从VS2010项目升级了,但我的linq查询现在不能为匿名类型求和

时间:2015-05-24 16:28:25

标签: c# linq visual-studio-2012

当我编译以下代码时,我收到错误" System.Linq.Grouping AnonymousType#1不包含sum的定义"

错误出现在Networth总和g的地方。如果我为Networth设置了一个类似0的值,那么查询的其余部分就可以了。

public static System.Collections.Generic.List<EBookLogic.NetworthYearSummary> GetNetworthProjectionSummary(System.Guid ebookId, out decimal targetNetWorth, out int targetAge)
    {
        targetNetWorth = 0m;
        targetAge = 0;
        System.Collections.Generic.List<EBookLogic.NetworthYearSummary> values = null;
        using (TrulityEntities ent = new TrulityEntities())
        {
            EBook eb = ent.EBooks.FirstOrDefault((EBook e) => e.EBookID == ebookId);
            if (eb != null)
            {
                targetNetWorth = (eb.TargetedNetworth ?? 0m);
                targetAge = (int)(eb.TargetAge ?? 0);
            }
            IOrderedQueryable<EBookLogic.NetworthYearSummary> result = 
                from t1 in ent.vwNetworthProjectionSummaries
                where t1.EBookID == ebookId
                group new
                {
                    t1
                } by t1.FinancialYear into g
                select new EBookLogic.NetworthYearSummary
                {
                    FinancialYear = (int)g.Key,
                    NetWorth = g.Sum((<>f__AnonymousType1<vwNetworthProjectionSummary> p) => p.t1.TotalAssets ?? (((decimal?)0m - p.t1.TotalLiabilities) ?? 0m))
                } into n
                orderby n.FinancialYear
                select n;
            values = result.ToList<EBookLogic.NetworthYearSummary>();
        }
        return values;

    }

2 个答案:

答案 0 :(得分:0)

问题在于我使用的反编译器,语法应该是:

NetWorth = g.Sum(p => 

无需投射。

答案 1 :(得分:0)

只需将你的三分钱投入你的答案(你说你使用了反编译器)......当你使用匿名类型时,编译器会代表你创建一个新类型。该类型是普通的CLR类型。然而它装饰有一个难以形容的名称,因此无法从用户代码调用它们。在您的情况下发生的事情是反编译器遇到了类型并使用了它遇到的名称。我猜测反编译代码中还有一个<>f__AnonymousType1类型。