2017-03-15 119 views
-1

我有一个简单的查询在SQL:转换SQL查询LINQ

SELECT 
    l.State, 
    AVG(ls.Amount) As StateAvg 
FROM 
    LeadSales ls 
    JOIN LEADS l on ls.LeadID = l.LeadID 
GROUP BY 
    l.State 

这工作:

enter image description here

有一个小麻烦,把它改为LINQ(其中queryLeadSales表)的一个IQueryable ...

var StateList = from q in query 
       group q by new 
       { 
         q.Lead.State, 
         q.Amount // <--- it this corrcect? 
       } into g 
       select new AverageLeadSalesPriceItem 
       { 
         StateCode = g.Key.State, 
         StateAverage = ???? 
        }; 

附:

public class AverageLeadSalesPriceItem 
{ 
    public string StateCode { get; set; } 
    public decimal? StateAverage { get; set; } 
} 
+1

可能重复的[获得平均使用LINQ](http://stackoverflow.com/questions/4590704/get-average-using-linq) – Pikoh

+0

/\ @皮考我看了看那一个,但无法做出答案工作。 –

+0

如何在C#中定义查询? – jdweng

回答

1

你不远处。 group子句应该按照您在SQL中分组的相同字段进行分组,然后分组构造对象g就像它自己的Enumerable/Queryable一样,包含组的所有行,您可以调用集合函数。因此,只有一个字段定义组密钥,因此不需要匿名类型,然后只需在g上调用Average(),即可定义标识字段平均值的投影。

var StateList = from q in query 
      group q by q.Lead.State into g 
      select new AverageLeadSalesPriceItem 
      { 
        StateCode = g.Key, 
        StateAverage = g.Average(gq=>gq.Amount), 
      }; 

记住,你的Linq查询,如果基于可查询的提供商像EF DbSet,不会对数据库执行,直到你表示你需要“真正的”内存中的对象,无论是含蓄通过调用方法返回一个或多个所述对象(First(),ToArray()等)或显式使用AsEnumerable()扩展方法。

1

这将是水木清华像

var StateList = from q in query 
       group q by new 
       { 
         q.Lead.State 
       } into g 
       select new AverageLeadSalesPriceItem 
       { 
         StateCode = g.Key.State, 
         StateAverage = g.Average(a=>a.Amount) 
        }; 

注意,如果你要动态地计算骨料(如在SQL),你可以使用专门的图书馆像NReco PivotData(我的这个开发商库,它对于单个部署项目是免费的)。