Lambda查询需要推断类型

本文关键字:类型 查询 Lambda | 更新日期: 2023-09-27 18:29:29

我正在尝试运行我继承的一些代码。它使用lambda表达式来返回一些发票和各种不同的计算值。代码如下。问题代码是:

var queryable = from i in this.db.Invoices
    join j in this.db.JobBooks on i.JobBook_ID equals (int?) j.Job_Book_ID into j
    where (i.Month == month) && (i.Year == year)
    select new { 
        inv = i,
        job = j
    };
return new AccountsTotal { 
    TotalActuals = Queryable.Sum(queryable, i => i.inv.Month_Value),
    TotalForecasts = Queryable.Sum(queryable, i => i.inv.Month_Forecast_Billing),
    TotalCredits = Queryable.Sum(queryable, i => i.inv.Credits),
    TotalInvoiced = Queryable.Sum(from i in queryable
        where (i.inv.Month_Value >= 0M) && ((i.inv.Month_Invoice_Number != null) && (i.inv.Month_Invoice_Number != ""))
        select i, i => i.inv.Month_Value),
    ISActuals =Queryable.Sum(from i in queryable
        where i.job.Business_Unit == 0
        select i, i => i.inv.Month_Value),
    ISForecasts = Queryable.Sum(from i in queryable
        where i.job.Business_Unit == 0
        select i, i => i.inv.Month_Forecast_Billing),
    ISCredits = Queryable.Sum(from i in queryable
        where i.job.Business_Unit == 0
        select i, i => i.inv.Credits),
    ICActuals = Queryable.Sum(from i in queryable
        where i.job.Business_Unit == 1
        select i, i => i.inv.Month_Value),
    ICForecasts = Queryable.Sum(from i in queryable
        where i.job.Business_Unit == 1
        select i, i => i.inv.Month_Forecast_Billing),
    ICCredits = Queryable.Sum(from i in queryable
        where i.job.Business_Unit == 1
        select i, i => i.inv.Credits)
};

在返回总数的部分,一切都很好,直到以"ISActual=Queryable…"开头的行

Queryable.Sum有一个错误,消息中说明了方法Queryable.Som的类型方法无法推断。我应该隐式地指定类型。我不确定在哪里,也不知道在哪里尝试过,但都失败了。它应该是一个小数。

下一行[I.job.Business_unit]说没有Business_unit的定义。如果我在过程的顶部声明了一个变量,但类型为job,那么它就会识别类和属性Business_Unit。

如果有人能帮上忙,那就太棒了。

Lambda查询需要推断类型

两个问题一个答案,但两个问题都解决了。我无法解释为什么或如何解决可查询问题,但事实是:我第一次发布这个问题是在我开发VS2012时,Tom您的选角解决方案是我尝试过的,但没有成功,尽管我认为它是正确的。然后,我把代码带到一台运行VS2015的机器上,我尝试在那里毫无乐趣地铸造它。然后我在没有石膏的情况下进行了另一次清理和重建,问题就消失了。回到2012年的代码,问题仍然没有了。我无法解释为什么。。

另一个问题,可枚举问题,通过将变量j强制转换为类类型作业来解决。

 select new { 
    inv = i,
    job = (JobBook)j
 };

奇怪的是为什么发票不需要石膏。我想这些都是从以前编译的程序集和反编译器创建程序集的结果。我试过Telerik,ILSpy,最后是Reflector。最后决定了。IT人员和前一位带着所有代码离开的开发人员需要一句强有力的话。。。

谢谢你们的帮助。。。