2011-02-10 93 views
0

是否可以在Lambda中编写等价的TSQL语句?c#Lambda子查询(linq2sql)

 
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' 
    ) 
) 
+0

你为什么要重写此查询到LINQ到SQL/EF,不要忘记的可能性在你的查询中表现松散。但从性能的角度来看,你应该重新设计你的查询imho。只需将where子句重写为内连接。 – JSC 2011-02-10 15:23:02

+0

使用linq2sql? linq over poco对象? – 2011-02-10 15:25:55

回答

1

我可以在这里总不会错,但它是这样的:

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)) 
    } 
);