C# c Lambda子查询(linq2sql)

C# c Lambda子查询(linq2sql),c#,linq-to-sql,lambda,subquery,C#,Linq To Sql,Lambda,Subquery,是否可以在Lambda中编写此TSQL语句的等效语句 SELECT DISTINCT pba1.adGroupsId , Amount = (SELECT pba2.value FROM ProjectBudgetAdjustment pba2 WHERE pba1.budgetId = pba2.budgetId AND pba1.adGro

是否可以在Lambda中编写此TSQL语句的等效语句

SELECT DISTINCT pba1.adGroupsId , Amount = (SELECT pba2.value FROM ProjectBudgetAdjustment pba2 WHERE pba1.budgetId = pba2.budgetId AND pba1.adGroupsId = pba2.adGroupsId AND pba2.metricId IN ( SELECT id FROM Metrics WHERE [description] = 'Amount') ) , [Hours] = (SELECT pba2.value FROM ProjectBudgetAdjustment pba2 WHERE pba1.budgetId = pba2.budgetId AND pba1.adGroupsId = pba2.adGroupsId AND pba2.metricId IN ( SELECT id FROM Metrics WHERE [description] = 'Hours') ) FROM ProjectBudgetAdjustment pba1 WHERE pba1.budgetId IN ( SELECT id FROM ProjectBudget WHERE projectId IN ( SELECT id FROM Projects WHERE code = 'xxx' ) )
我可能完全错了,但这是不是像:

ProjectBudgetAdjustment
.Where( pba => pba.ProductBudget.Products.Code == "xxx")
.Where( pba => (pba.Metrics.Description == "Hours" 
             || pba.Metrics.Description == "Amount"))
.GroupBy(   pba => pba.ProductBudget.adGroupsId )
.Select (
    r => new
    {
        adGroupsId = r.Key,
        Hours  = r.Sum(i=> (i.Metrics.Description == "Hours"  ? i.value : 0m)),
        Amount = r.Sum(i=> (i.Metrics.Description == "Amount" ? i.value : 0m))
    }
);

为什么要将此查询重写为LINQ to SQL/EF,请不要忘记可能会降低查询的性能。但从性能的角度来看,您应该重新设计查询imho。只需将where子句重写为一个内部联接。使用linq2sql?linq over poco objects?Lambda返回的行太多,四个规程各有一个数量和小时,因此Lambda返回8行。我把SQL放在这里作为TSQL如何处理它的一个例子,性能并没有考虑在内。如果不可能,我将需要重新访问数据库体系结构。上面的lambda是正确的,只是现在我必须处理枚举匿名类型的对象,而不必是匿名的。如果您有一个合适的类,比如ProjectSummary,那么您可以将表达式更改为。Selectr=>newprojectsummary{adGroupsId=r.Key,….是的,谢谢。我度过了一个混乱的一周,因为国定假日和内乱,但现在有时间在办公室发表讲话,谢谢。