Lambda查询需要推断类型

时间:2016-01-07 23:31:46

标签: c# linq lambda

我正在尝试运行一些我继承的代码。它使用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.Sum的类型方法。我应该隐式指定类型。我不确定在哪里,并尝试过它似乎合乎逻辑的地方,它们都失败了。它应该是小数。

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

如果有人可以帮忙解决这个问题,那就太棒了。

1 个答案:

答案 0 :(得分:0)

两个问题一个答案,但两个问题都解决了。我无法解释为什么或如何解决可查询问题,但它是:我第一次发布这个问题,而我正在研究VS2012和汤姆你的投射解决方案是我尝试过但它没有用,虽然我认为它是对。然后我把代码带到了运行VS2015的机器上,我试着把它放在那里,没有任何乐趣。然后我做了另一个干净的重建没有演员,问题就消失了。带着代码回到2012年,问题依旧不复存在。我无法解释如何或为什么......

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

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

奇怪为什么发票不需要演员。我猜这些东西是从先前编译的程序集和反编译器创建程序集的结果。我试过Telerik,ILSpy,最后是Reflector。终于落到了最后。信息技术人员的身体和以前的开发人员在使用所有代码时都需要一个强有力的词汇......

谢谢你的帮助......